Зачем вызывать mb_convert_encoding для дезинфекции текста?

Это относится к этому (отличному) ответу. Он утверждает, что лучшим решением для экранирования ввода в 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');

Есть ли у меня какая-то польза, которую мне не хватает?

Ответ 1

Не все двоичные данные действительны 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 удалит ее из строки (или переведет ее на '.' или что-то еще: -).