Будет ли HTML-кодирование предотвращать все виды XSS-атак?


меня не волнуют другие виды атак. Просто хочу знать, может ли кодирование HTML предотвратить все виды атак XSS.

есть ли способ сделать атаку XSS, даже если используется кодирование HTML?

9 60

9 ответов:

нет.

отложив тему разрешения некоторых тегов (не совсем вопрос), HtmlEncode просто не охватывает все атаки XSS.

например, рассмотрим серверным JavaScript на стороне клиента - сервера, динамически выводит значения htmlencoded непосредственно в JavaScript на стороне клиента, функция htmlencode будет не остановить вводится скрипт из выполнения.

Далее рассмотрим следующие псевдокод:

<input value=<%= HtmlEncode(somevar) %> id=textbox>

теперь, если это не сразу очевидно, если somevar (отправленный пользователем, конечно) установлен, например, в

a onclick=alert(document.cookie)

полученный результат

<input value=a onclick=alert(document.cookie) id=textbox>

который будет явно работать. Очевидно, что это может быть (почти) любой другой сценарий... и HtmlEncode не сильно поможет.

есть несколько дополнительных векторов, которые необходимо рассмотреть... в том числе третий вкус XSS, называемый DOM-based XSS (где вредоносный скрипт генерируется динамически на клиенте, например, на основе значений#).

также не забывайте об атаках типа UTF-7-где атака выглядит как

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

нечего там кодировать...

решение, конечно (в дополнение к правильной и ограничительной проверке ввода белого списка), заключается в выполнении контекстно-зависимая кодирование: HtmlEncoding отлично подходит, если вы выводите контекст HTML, или, возможно, вам нужно JavaScriptEncoding, или VBScriptEncoding, или AttributeValueEncoding, or... так далее.

если вы используете MS ASP.NET вы можете использовать их библиотеку Anti-XSS, которая предоставляет все необходимые методы контекстного кодирования.

обратите внимание, что вся кодировка не должна ограничиваться пользовательским вводом, но также сохраненными значениями из базы данных, текстовыми файлами и т. д.

О, и не забудьте явно установить кодировку, как в заголовке HTTP, так и в метатеге, иначе у вас все равно будет UTF-7 факторы уязвимости...

еще немного информации и довольно окончательный список (постоянно обновляется), проверьте шпаргалку RSnake: http://ha.ckers.org/xss.html

Если вы систематически кодируете все вводимые пользователем данные перед отображением тогда да, вы в безопасности вы все еще не на 100 % безопасным.
(См. сообщение @Avid для получения более подробной информации)

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

вам придется настроить принятие решений система решает, какие теги разрешены, а какие нет, и всегда возможно, что кто-то найдет способ пропустить недопустимый тег.

Это поможет, если вы последуете совету Джоэла Делая Неправильный Код Выглядеть Неправильно или ваш язык помогает предупреждая / не компилируя при выводе необработанных пользовательских данных (статический ввод).

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

Так что вы можете проверить вещи на стороне ввода тоже. И вы можете проверить то, что Вы читаете из базы данных.

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

Как упомянутые Пэт иногда вы хотите отобразить некоторые теги, но не все теги. Одним из распространенных способов сделать это-использовать язык разметки, как текстильной,Markdown или BBCode. Однако даже языки разметки могут быть уязвимы для XSS, просто имейте в виду.

# Markup example
[foo](javascript:alert\('bar'\);)

Если вы решите пропустить" безопасные " теги, я бы рекомендовал найти некоторую существующую библиотеку для анализа и очистки вашего кода перед выводом. Есть много векторов XSS там, что вы должны были бы обнаружить, прежде чем ваш дезинфицирующее средство является довольно безопасным.

Я второй совет метавиды, чтобы найти стороннюю библиотеку для обработки выходной фильтрации. Нейтрализация HTML-символов является хорошим подходом к остановке XSS-атак. Однако код, который вы используете для преобразования метасимволов, может быть уязвим для атак уклонения; например, если он неправильно обрабатывает Unicode и интернационализацию.

классическая простая ошибка доморощенных выходных фильтров заключается в том, чтобы поймать только , но пропустить такие вещи, Как", которые могут нарушить управляемый пользователем выход выход в атрибутивное пространство тега HTML, где Javascript может быть прикреплен к DOM.

нет, просто кодирование общих HTML-токенов не полностью защищает ваш сайт от атак XSS. См., например, эту уязвимость XSS, найденную в google.com:

http://www.securiteam.com/securitynews/6Z00L0AEUE.html

важная вещь об этом типе уязвимости заключается в том, что злоумышленник может кодировать свою полезную нагрузку XSS с помощью UTF-7, и если вы не указали другую кодировку символов на своей странице, браузер пользователя может интерпретировать полезная нагрузка UTF-7 и выполнить сценарий атаки.

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

Я хотел бы предложить очиститель HTML (http://htmlpurifier.org/) он не просто фильтрует html, он в основном маркирует и повторно компилирует его. Это действительно промышленная сила.

Он имеет дополнительное преимущество, позволяя вам обеспечить допустимый вывод html / xhtml.

также n'thing textile, его отличный инструмент, и я использую его все время, но я бы запустил его, Хотя html-очиститель тоже.

Я не думаю, что вы поняли, что я имел в виду re токены. ФОРМАТ HTML Очиститель не просто "фильтрует", он фактически реконструирует html. http://htmlpurifier.org/comparison.html

Я так не считаю. Html Encode преобразует все функциональные символы (символы, которые могут быть интерпретированы браузером как код) в ссылки на сущности, которые не могут быть проанализированы браузером и, следовательно, не могут быть выполнены.

&lt;script/&gt;

нет никакого способа, что выше может быть выполнена с помощью браузера.

* * если их не является ошибкой в браузере, конечно.*