Я уже знаю, как работает XSS, но выяснить, как много разных способов вводить вредоносный ввод, не является вариантом.
Я видел пару библиотек, но большинство из них очень неполные, неопределенные или лицензированные GPL (когда вы, ребята, узнаете, что GPL нехорошо поделиться небольшими библиотеками! Используйте MIT)
OWASP предлагает библиотеку кодирования, на которую было потрачено время для обработки различных случаев.
Устаревшее: http://www.owasp.org/index.php/Category:OWASP_Encoding_Project
Теперь на странице http://code.google.com/p/reform/
и специальная библиотека OXASP для антихесов: http://code.google.com/p/php-antixss/
htmlspecialchars()
– единственная функция, о которой вы должны знать.
HTMLPurifier – это бесспорный лучший вариант для очистки ввода HTML, а htmlspecialchars следует применять ко всему остальному.
Но уязвимость XSS не должна быть очищена , потому что любые подобные материалы являются мусором в любом случае. Скорее сделайте заявку на поруки и напишите запись в журнале. Лучший фильтр, предназначенный для обнаружения XSS, находится в основных правилах mod_security .
Я использую незащищенное, но довольно полное обнаружение атрибутов здесь, в новом вводе () , см. Метод _xss.
Редактировать: Спасибо @mario за указание, что все зависит от контекста . На самом деле нет никакого способа предотвратить все это во всех случаях. Вы должны соответствующим образом настроить.
Редактировать: я стою исправлен и очень благодарен за поддержку @bobince и @ Rook по этому вопросу. Теперь мне стало ясно, что strip_tags
не предотвратит атаки XSS .
Я просмотрел весь свой код, прежде чем отвечать на вопрос, был ли я каким-либо образом открыт, и все это хорошо из-за htmlentities($a, ENT_QUOTES)
который я использовал в основном для работы с W3C.
Это сказало, что я обновил функцию ниже, чтобы немного имитировать ту, которую я использую. Я все еще считаю, что strip_tags
приятно иметь перед htmlentities, так что, когда пользователь пытается ввести теги, они не будут загрязнять конечный результат. Скажите, что пользователь вводил: <b>ok!</b>
гораздо приятнее показать это как ok!
чем распечатать полный текст htmlentities, преобразованный.
Спасибо вам большое за то, что нашли время, чтобы ответить и объяснить.
Если это исходит от пользователя Интернета:
// the text should not carry tags in the first place function clean_up($text) { return htmlentities(strip_tags($text), ENT_QUOTES, 'UTF-8'); }
Если это исходит от бэк-офиса … не надо.
Существуют вполне обоснованные причины, по которым кому-то в компании может понадобиться javascript для той или иной страницы. Гораздо лучше иметь возможность регистрироваться и винить, чем закрывать своих пользователей.
Мне нравится htmlpurifier отлично, но я вижу, как он может быть неэффективным, так как он довольно большой. Кроме того, это LGPL, и я не знаю, попадает ли это под ваш запрет GPL.
В дополнение к ответу zerkms , если вы обнаружите, что вам нужно принять отправленный пользователем HTML (например, из редактора WYSIWYG), вам нужно будет использовать парсер HTML для определения того, что может и не может быть отправлено.
Я использую и рекомендую очиститель HTML .
Примечание. Даже не пытайтесь использовать регулярное выражение 🙂
Я удивлен, что здесь не упоминается, но я предпочитаю htmlAwed для htmlPurifier. Это современная, красиво лицензированная, очень маленькая и очень быстрая.