проблема интернет-обозревателя urlencode - PullRequest
1 голос
/ 21 сентября 2011

У меня странная проблема с Internet Explorer и греческими переменными get. У меня есть простой скрипт (в кодировке utf-8) в php, который делает следующее:

$term = $_GET['term'];
// term processing
echo htmlspecialchars($term);
echo '<form method="GET" action="/script.php">';
echo '<input type="hidden" name="ref" value="'.$term.'">';
echo '<input type='submit' value="do submit()">';
echo '</form>';

Я называю сценарий обычным способом: http://localhost/form.php?term=διαστημοπλοιο. Теперь в Chrome, Firefox (Mac), Safari (Mac) значение становится нормальным (оно будет отображать% CE% B4% CE% B9% CE% B1% CF% 83% CF% 84% CE% B7% CE% BC % CE% BF% CF% 80% CE% BB% CE% BF% CE% B9% CE% BF - процентное кодирование utf-8), в Internet Explorer 8+ (окна) я получаю искаженный текст (пустые квадраты). Есть что-то, что я должен проверить? Я использовал mb_detect_encoding и строка в кодировке UTF-8.

Я также использовал следующие тесты (код php ниже), и между браузерами есть различия:

<code>header("Content-type:text/html;charset=utf-8");
$term = $_GET['term'];
echo "<pre>";
echo "DECODED:".urldecode($term)."\n";
echo "TERM ENCODING (FROM BROWSER) [mb_detect_encoding]:".mb_detect_encoding($term)."\n";
echo "UTF-8:\n";
echo 'URLDECODE:'."\t".urlencode($term)."\n";
echo 'RAWURLDECODE:'."\t".rawurlencode($term)."\n";
echo 'URLDECODE:'."\t".urldecode(utf8_encode(urlencode($term)))."\n";
echo 'RAWURLDECODE:'."\t".rawurlencode($term)."\n";
echo "UTF-8->cp1253 iv:\n";
$zz = iconv('UTF-8','cp1253',$term);
echo 'URLDECODE:'."\t".urlencode(iconv('UTF-8','cp1253',$term))."\n";
echo "cp1253->UTF-8 iv:\n";
echo 'URLDECODE:'."\t".urlencode(iconv('cp1253','UTF-8',$zz))."\n";
echo "
";

Результаты для Mac / Linux были:

DECODED:διαστημοπλοιο
TERM ENCODING (FROM BROWSER) [mb_detect_encoding]:UTF-8
UTF-8:
URLDECODE:  %CE%B4%CE%B9%CE%B1%CF%83%CF%84%CE%B7%CE%BC%CE%BF%CF%80%CE%BB%CE%BF%CE%B9%CE%BF
RAWURLDECODE:   %CE%B4%CE%B9%CE%B1%CF%83%CF%84%CE%B7%CE%BC%CE%BF%CF%80%CE%BB%CE%BF%CE%B9%CE%BF
URLDECODE:  διαστημοπλοιο
RAWURLDECODE:   %CE%B4%CE%B9%CE%B1%CF%83%CF%84%CE%B7%CE%BC%CE%BF%CF%80%CE%BB%CE%BF%CE%B9%CE%BF
UTF-8->cp1253 iv:
URLDECODE:  %E4%E9%E1%F3%F4%E7%EC%EF%F0%EB%EF%E9%EF
cp1253->UTF-8 iv:
URLDECODE:  %CE%B4%CE%B9%CE%B1%CF%83%CF%84%CE%B7%CE%BC%CE%BF%CF%80%CE%BB%CE%BF%CE%B9%CE%BF

Результаты по IE ​​были:

DECODED:�������������
TERM ENCODING (FROM BROWSER) [mb_detect_encoding]:UTF-8
UTF-8:
URLDECODE:  %E4%E9%E1%F3%F4%E7%EC%EF%F0%EB%EF%E9%EF
RAWURLDECODE:   %E4%E9%E1%F3%F4%E7%EC%EF%F0%EB%EF%E9%EF
URLDECODE:  �������������
RAWURLDECODE:   %E4%E9%E1%F3%F4%E7%EC%EF%F0%EB%EF%E9%EF
UTF-8->cp1253 iv:

Notice:  iconv() [function.iconv]: Detected an illegal character in input string in /Users/xalapan/Sites/drupal/io.php on line 15

Notice:  iconv() [function.iconv]: Detected an illegal character in input string in /Users/xalapan/Sites/drupal/io.php on line 16
URLDECODE:  
cp1253->UTF-8 iv:
URLDECODE:

1 Ответ

1 голос
/ 21 сентября 2011

Вам нужно htmlspecialchars(), а не urlencode(). Неиспользование htmlspecialchars приводит к уязвимостям XSS.

echo '<input type="hidden" name="ref" value="'.htmlspecialchars($term).'">';

Кроме того, значения в $_GET уже уже декодированы . Вы не должны декодировать их снова.

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