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» фильтры пытаются, но они неизменно терпят неудачу.