Существует ли определенная анти-XSS-библиотека для PHP?
Я уже знаю, как работает XSS, но выяснить, как много разных способов вводить вредоносный ввод, не является вариантом.
Я видел пару библиотек, но большинство из них очень неполные, неопределенные или лицензированные GPL (когда вы, ребята, узнаете, что GPL нехорошо поделиться небольшими библиотеками! Использовать MIT)
Ответы
Ответ 1
OWASP предлагает библиотеку кодирования, на которую было потрачено время для обработки различных случаев.
Устаревшее: http://www.owasp.org/index.php/Category:OWASP_Encoding_Project
Теперь на http://code.google.com/p/reform/
и специальная библиотека OWASP antiXSS находится по адресу: http://code.google.com/p/php-antixss/
Ответ 2
htmlspecialchars()
- единственная функция, о которой вы должны знать.
Ответ 3
HTMLPurifier - это бесспорный лучший вариант для очистки ввода HTML, а htmlspecialchars следует применять ко всему остальному.
Но уязвимости XSS не должны быть очищены, потому что любые такие представления - мусор в любом случае. Скорее сделайте заявку на поруки и напишите запись в журнале. Лучший фильтр, предназначенный для обнаружения XSS, находится в основных правилах mod_security.
Я использую незащищенное, но довольно полное обнаружение атрибутов здесь, в новом вводе(), см. метод _xss.
Ответ 4
Изменить: Спасибо @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 для той или иной страницы. Это намного лучше, чтобы иметь возможность регистрироваться и винить, чем закрывать ваших пользователей.
Ответ 5
Мне нравится htmlpurifier отлично, но я вижу, как он может быть неэффективным, так как он довольно большой. Кроме того, это LGPL, и я не знаю, попадает ли это под ваш запрет GPL.
Ответ 6
В дополнение к ответу zerkms, если вы обнаружите, что вам нужно принять отправленный пользователем HTML (например, из редактора WYSIWYG), вам нужно будет использовать HTML-код анализатор, чтобы определить, что может и не может быть отправлено.
Я использую и рекомендую Очиститель HTML.
Примечание: Не пытайтесь использовать регулярное выражение:)
Ответ 7
Я удивлен, что здесь не упоминается, но я предпочитаю htmlAwed в htmlPurifier. Это современный, красиво лицензированный, очень маленький и очень быстрый.