Фильтрация пользовательского ввода - нужно ли фильтровать HTML?
Примечание: Я забочусь о внедрении SQL и экранировании вывода в другом месте - этот вопрос касается только фильтрации ввода, спасибо.
Я занимаюсь рефакторингом своих функций фильтрации пользовательского ввода. Перед передачей параметра GET/POST фильтру определенного типа с помощью filter_var() я делаю следующее:
- проверьте кодировку параметров с помощью mb_detect_encoding()
- преобразовать в UTF-8 с помощью iconv() (с//ИГНОРИРОВАТЬ), если это не ASCII или UTF-8
- очистите пробелы с помощью функции, найденной на GnuCitizen.org
- передайте результат через strip_tags() - теги вообще не разрешены, только уценка
Теперь вопрос: все еще имеет смысл передавать параметр в фильтр, такой как HTMLAWED или Очиститель HTML, или я могу считать ввод безопасным? Мне кажется, что эти два отличаются в основном степенью детализации разрешенных HTML-элементов и атрибутов (которые я не интересует, так как я удаляю все), но в документах htmLawed есть раздел об "опасных символах", который предполагает, что может быть причина для его использования. В этом случае, какова была бы разумная конфигурация для этого?
2 answers
Существует множество различных подходов к XSS, которые являются безопасными. Единственная причина узнать, выдерживает ли ваш подход воду, - это проверить его эксплуатацию. Я рекомендую использовать Бесплатный сканер уязвимостей XSS* или открытый исходный код 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-код не должен проходить через ваш фильтр