Разве UTF-7 невозможен, если кодировка htmlspecialchars не установлена, несмотря на кодировку заголовка HTTP?

Я хочу проверить это дважды и считаю, что это будет полезно для других. Если кто-то использует htmlspecialchars($var) в своем коде и использует версию PHP до 5.4, то он открыт для utf-7 XSS. Это дано. Правильно ли я полагаю, что сайт все еще будет открыт для utf-7 XSS, даже если набор символов содержимого заголовка - utf-8, так как набор символов содержимого сервера PHP по умолчанию iso-8859-1?

Изменить: меня спросили, что я надеюсь извлечь из этого выгоду. Я надеюсь убедиться, что проект не уязвим для utf-7, так как некоторые программисты не склонны устанавливать третий параметр htmlspecialchars, который является набором символов. Если вы понимаете набор символов сервера, о котором я упоминал, и то, как он вписывается в utf-7, тогда я действительно могу использовать вашу помощь.

2 ответа

Решение

Предполагая, что вы говорите о выводе контролируемых пользователем значений на страницу, тогда, если заголовок HTTP установлен в UTF-8, вот так

Content-Type: text/html; charset=utf-8

тогда XSS не может быть достигнут с использованием кодировки UTF-7.

charset Параметр не влияет на атаки UTF-7. Байт, который имеет специальные полномочия в UTF-7, равен 0x2B (ASCII +), а также htmlspecialchars() никогда не избежит этого

Если у вас есть пользовательская строка (в ASCII-совместимой кодировке, например, UTF-8), которую вы хотите включить в веб-страницу, использующую кодировку UTF-7, вам придется преобразовать эту строку с помощью iconv('utf-8', 'utf-7', $str) после звонка htmlspecialchars на строке UTF-8. Это преобразование кодировки является отдельной операцией для выхода из HTML.

В теории вы могли бы использовать htmlspecialchars($s, ENT_xxx, 'utf-7') в HTML-кодирование строки, которая уже была в кодировке UTF-7, за исключением того, что, в отличие от расширения iconv, native-PHP htmlspecialchars функция не поддерживает UTF-7.

Но дело в том, что современные браузеры не позволят вам использовать UTF-7, и никто никогда не создавал преднамеренно веб-страницу UTF-7.

Настоящие атаки UTF-7 происходят не из-за отсутствия HTML-кодировки, а потому, что браузер обрабатывает страницу как содержащую байты UTF-7, когда это не было задумано. Это легко остановить, включив явное объявление charset либо в HTTP Content-Type заголовок (как продемонстрировано SilverlightFox, +1), или в <meta> элемент, включенный в страницу перед любым пользовательским контентом.

Другие вопросы по тегам