php: поиск определенных символов в URL-запросе - борьба с не-ascii - PullRequest
0 голосов
/ 09 мая 2011

Хорошо - название в основном говорит об этом.
Я хочу посмотреть на запрос URL-адресов и искать конкретные значения (одиночный символ или небольшая строка).

Я могу сделать это успешно - до тех пор, пока я ищу только «нормальные» символы (те, которые часто называют «безопасными» [a-zA-Z0-9 -_. ~]).
Как только я начинаю искать «небезопасных» или «чужих» персонажей - становится ужасно.
Я потратил весь день (и часть вчерашнего дня), пытаясь понять это.
Я прочитал тонны ... RFC, php.net для кодирования, обнаружения кодирования и т. Д.
Я даже пытался установить кодировку / кодировку в верхней части скрипта и т. Д.
Я прошел через различные параметры кодирования, настройки динамически, вручную и т. Д.
Ничего не сработало.

Попробуйте маленький скрипт ниже.
добавьте его в файл и получите к нему доступ и добавьте путь запроса ниже;
? q = a1 -. <^ 舆 </p>

Посмотри, что ты получишь.

function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}


$needles = array(
    needle1 => 'a', 
    needle2 => '1', 
    needle3 => '-', 
    needle4 => '.', 
    needle5 => '<',
    needle6 => '^',
    needle7 => 'Ë',
    needle8 => 'à',
    needle9 => 'Ü'
);

$haystack = parse_url(curPageURL(), PHP_URL_QUERY);


if (!empty($haystack)) {
    $needlelist = implode(' | ',$needles);

    echo "We are looking for some needles ( ".$needlelist." ) in a haystack    (".$haystack.")<br/>";

    foreach ($needles as $key=>$needle) {

        echo "We are looking for ".$key."<br/>";
        $check = strpos($haystack,$needle);
        if ($check !== false) {
            echo " - Yes : we found a needle (".$needle.") in the haystack";
        } else {
            echo " - No : we failed to find the needle (".$needle.") in the haystack";
        }
        echo "<br/>";

}



echo "--------------<br/>now lets try it with a little basing?<br/>";



foreach ($needles as $key=>$needle) {

    echo "We are looking for ".$key."<br/>";

    // Basing - encode the searched for value, and replace any double-encoded % chars
    $needle = str_replace('%25','%',rawurlencode($needle));

    $check = strpos($haystack,$needle);
    if ($check !== false) {
        echo " - Yes : we found a needle (".$needle.") in the haystack";
    } else {
        echo " - No : we failed to find the needle (".$needle.") in the haystack";
    }
    echo "<br/>";

}
}

Я не знаю о вас, но вместо странных символов или их правильных шестнадцатеричных кодов (согласно различным спискам / таблицам для urlencoded символов), Я получаю следующее ([искал] (1-е результаты) (2-е результаты));

/ a a a
/ 1 1 1
/ - - -
/. , .
/ <<% 3C <br> / ^ ^% 5E
/ Ë Ã ‹% C3% 8B
/ а% C3% A0
/ Ü Ãœ% C3% 9C

( / добавлено для предотвращения вставки строки + кодировка здесь делает это очень трудным для публикации! )

проблема - например, последняя ... Ü должен стать% DC (насколько я могу судить) - так почему же спаренный гекс?

Я пытался читать многобайтовые файлы ... но я не вижу, как браузеры кодируют символы в URL, но сценарий не будет.

Итак - кто-нибудь видит, что я делаю неправильно или не делаю, или уже понял это?

.

Ради ясности ...
... Я НЕ спрашиваю, как заменить символы (я не хочу превращать Ü в U). Просто возьмите данную строку и посмотрите, есть ли она в URL (прямая или закодированная для URL).

Спасибо, и я надеюсь, что кто-то может помочь.

1 Ответ

0 голосов
/ 09 мая 2011

Различные результаты обусловлены разными кодировками символов. Сегодняшние браузеры обычно используют UTF-8 для кодирования текста при вводе непосредственно в адресную строку, а Ü, закодированный в UTF-8 с 0xC39C, кодируется с %C3%9C, поскольку и 0xC3, и 0x9C не являются действительными байтами в URL-адресах. И если вы интерпретируете 0xC39C с помощью однобайтовой кодировки символов, например Windows-1252, вы получите два символа à (0xC3) и œ (0x9C).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...