Фильтрация входных данных пользователя – нужно ли фильтровать HTML?

Примечание. Я позабочусь о том, чтобы SQL-инъекция и вывод выполнялись в другом месте – этот вопрос касается только фильтрации входных данных, спасибо.

Я нахожусь в центре рефакторинга функций фильтрации пользовательских входных данных. Перед передачей параметра GET / POST в фильтр, специфичный для конкретного типа, с помощью filter_var () я делаю следующее:

  • проверьте кодировку параметра с помощью mb_detect_encoding ()
  • конвертировать в UTF-8 с помощью iconv () (с // IGNORE), если это не ASCII или UTF-8
  • чистые пробелы с функцией, найденной на GnuCitizen.org
  • передать результат через strip_tags () – никаких тегов не разрешено вообще, только Markdown

Теперь вопрос: имеет ли смысл передавать параметр в фильтр, например htmLawed или HTML Purifier , или я могу считать ввод безопасным? Мне кажется, что эти два отличаются в основном детализацией допустимых HTML-элементов и атрибутов (которые меня не интересуют, поскольку я удаляю все), но htmLawed docs содержит раздел о « опасных персонажах », который предполагает, что может быть причина его использования. В этом случае, для чего это была бы разумная конфигурация?

Существует много разных подходов к XSS, которые являются безопасными. Единственное, почему нужно знать, поддерживает ли ваш подход воду, – это проверить, хотя эксплуатация. Я рекомендую использовать Free XSS-уязвимость Scanner * или wapiti с открытым исходным кодом.

Честно говоря, я никогда не буду использовать strip_tags (), потому что вам не нужны html-теги для запуска javascript! Мне нравится htmlspecialchars($var,ENT_QUOTES); ,

Например, это уязвимо для xss:

 print('<A HREF="http://www.xssed.com/'.strip_tags($_REQUEST[xss]).'">link</a>'); 

Вам не нужно <> выполнять javascript в этом случае, потому что вы можете использовать onmouseover, вот пример атаки:

 $_REQUEST[xss]='" onMouseOver="alert(/xss/)"'; 

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

* Я связан с этим сайтом / службой.

я думаю, что вы делаете безопасно, по крайней мере, с моей точки зрения, ни один HTML-код не должен проходить через ваш фильтр