Это относится к этому (отличному) ответу . Он утверждает, что лучшим решением для экранирования ввода в PHP является вызов mb_convert_encoding, за которым следует html_entities .
Но почему именно вы бы назвали mb_convert_encoding с теми же параметрами и с параметрами (UTF8)?
Выдержка из исходного ответа:
Даже если вы используете htmlspecialchars ($ string) за пределами HTML-тегов, вы по-прежнему уязвимы для многобайтовых символов атаки набора символов.
Наиболее эффективным может быть использование комбинации mb_convert_encoding и htmlentities следующим образом.
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); $str = htmlentities($str, ENT_QUOTES, 'UTF-8');
Есть ли у меня какая-то польза, которую мне не хватает?
Не все двоичные данные действительны UTF8. Вызов mb_convert_encoding
с тем же из / в кодирование – это простой способ убедиться, что вы имеете дело с правильно кодированной строкой для данной кодировки.
Способ использования пропусков проверки UTF8 описан в разделе 6 (соображения безопасности) в rfc2279 :
Другим примером может быть синтаксический анализатор, который запрещает октетную последовательность 2F 2E 2E 2F («/../»), но разрешает незаконную последовательность октетов 2F C0 AE 2E 2F.
Это может быть более легко понято путем изучения двоичного представления:
110xxxxx 10xxxxxx # header bits used by the encoding 11000000 10101110 # C0 AE 00101110 # 2E the '.' character
Другими словами: (C0 AE - header-bits) == '.'
Как указано в цитированном тексте, C0 AE не является допустимой последовательностью октетов UTF8, поэтому mb_convert_encoding
бы ее из строки (или перевел ее на '.'
Или что-то еще :-).