AntiSamy позволяет получать оповещения закодированного скрипта? Как заблокировать? - PullRequest
2 голосов
/ 08 августа 2010

Я использую AntiSamy с доступной политикой antisamy-1.4.1.xml.Политика работает хорошо, чтобы блокировать большинство XSS-атак, но следующее не блокируется.Любые предложения о том, как заблокировать следующее ниже, чтобы предотвратить атаки XSS?

1234%27%2Balert%2873918%29%2B%27

Спасибо

1 Ответ

15 голосов
/ 08 августа 2010

Antisamy - это фильтр содержимого HTML, позволяющий ненадежному пользователю вводить ограниченное подмножество «безопасного» HTML. Это , а не универсальный входной фильтр, который может избавить вас от необходимости думать о экранировании строк и проблемах XSS.

Вы должны использовать антисамминг только для очистки контента, который будет содержать HTML, который вы хотите дословно выводить на страницу. В большинстве случаев пользовательский ввод не является HTML: когда пользователь вводит a<b or c>d, он обычно должен получать буквенные символы меньше и больше, а не жирный тег. Чтобы убедиться, что это происходит правильно, вы должны экранировать HTML-код всего текстового содержимого, которое вставляется на вашу страницу на этапе вывода, вместо того, чтобы что-либо делать с антисемией.

1234%27%2Balert%2873918%29%2B%27

Это не похоже на обычную HTML-инъекцию. Единственный «специальный» символ, который он содержит, - это апостроф, который обычно не является особым в HTML и практически не может быть отфильтрован из ввода, поскольку пользователям обычно нужно использовать апострофы для письма на английском языке.

Если это вызывает инъекцию скрипта для вашего приложения, у вас есть большие проблемы, чем то, что может решить антисемия. Если из-за этого на вашей странице появляется диалоговое окно alert(), вы, вероятно, используете значение unescaped в строковом литерале JavaScript, например что-то вроде:

<a href="..." onclick="callfunc('hello <%= somevar %>');">

Для помещения текстового содержимого в код JavaScript в виде строкового литерала требуется другая форма экранирования; тот, который превращает символ ' (%27 в URL-кодированном вводе) в \' с обратной косой чертой, а сам \ в \\ (а также несколько других замен).

Простой способ получить значения (строки или иные) из серверного языка сценариев в литерал JavaScript - это использовать стандартный кодировщик JSON.

Однако в приведенном выше случае строковый литерал JavaScript сам содержится в атрибуте HTML, поэтому вам придется кодировать HTML кодировщика JSON. Это немного уродливо; Лучше избегать встроенных атрибутов обработчика событий. Вместо этого используйте внешние сценарии и <script> элементы, связывая события из JS вместо HTML.

Даже в блоке <script>, где вам обычно не нужно кодировать HTML, вы должны остерегаться строки </script> (или, вообще, всего, что начинается с </, которое может завершить блок) , Чтобы избежать этой последовательности, вы должны заменить символ < чем-то другим, например. \x3C. Некоторые кодировщики JSON могут иметь возможность сделать это для вас, чтобы избежать проблем.

Есть много других мест, где вставка контента в содержащий язык требует специальных видов кодирования. У каждого свои правила. Вы не можете избежать сложности строкового кодирования, используя универсальный входной фильтр. Некоторые «анти-XSS» фильтры пытаются, но они неизменно терпят неудачу.

...