Я уже несколько дней охочусь за сетью, пытаясь понять это, но получаю противоречивые ответы.
Есть ли библиотека, класс или функция для PHP, которая надежно защищает/кодирует строку против XSS? Он должен регулярно обновляться, чтобы противостоять новым атакам.
У меня есть несколько вариантов использования:
Случай использования 1) У меня есть текстовое поле, например, для имени или фамилии
- Пользователь вводит текст в поле и отправляет форму
- Прежде чем это будет сохранено в базе данных, я хочу a) обрезать любые пробелы спереди и конец строки и b) удалите все теги HTML из ввода. Это текстовое поле имени, у них не должно быть никакого HTML-кода.
- Затем я сохраню это в базе данных с подготовленными инструкциями PDO.
Я думаю, что могу просто сделать trim()
и strip_tags()
, затем использовать Sanitize Filter или RegEx со списком символов, Им действительно нужны персонажи! а также? или <
>
в их имени, на самом деле.
Случай использования 2) При выводе содержимого из ранее сохраненной записи базы данных (или из ранее представленной формы) в представление /HTML я хочу полностью очистить ее для XSS. NB: Возможно, он прошел или не прошел этап фильтрации в прецеденте 1, поскольку он может быть другим типом ввода, поэтому не предполагайте, что никакая дезинфекция не была выполнена.
Изначально я, хотя HTMLPurifier выполнял бы эту работу, но, как мне кажется, это не то, что мне нужно, когда Я поставил вопрос на их поддержку
Вот пример лакмусовой бумажки: если пользователь отправляет
<b>foo</b>
, должен ли он отображаться как<b>foo</b>
или foo? Если первый, вам не нужен очиститель HTML.
Поэтому я предпочел бы, чтобы он появился как <b>foo</b>
, потому что я не хочу, чтобы какой-либо HTML отображался для простого текстового поля или любого выполняемого JavaScript.
Итак, я охотился за функцией, которая сделает все это для меня. Я наткнулся на метод xss_clean, используемый Kohana 3.0, который, как я предполагаю, работает, но только в том случае, если вы хотите сохранить HTML. Теперь он устарел от Kohana 3.1, поскольку они заменили его на HTMLPurifier. Поэтому я предполагаю, что вы должны сделать HTML::chars()
вместо этого, но только этот код:
public static function chars($value, $double_encode = TRUE)
{
return htmlspecialchars( (string) $value, ENT_QUOTES, Kohana::$charset, $double_encode);
}
Теперь, по-видимому, вы должны использовать htmlentities вместо упомянутого в довольно несколько мест в переполнении стека, поскольку он более безопасен, чем htmlspecialchars.
- Итак, как использовать htmlentities правильно?
- Это все, что мне нужно?
- Как защитить от шестнадцатеричных, десятичных и базовых 64 кодированных значений, отправленных из перечисленных атак здесь?
Теперь я вижу, что третий параметр для метода htmlentities - это кодировка, которая будет использоваться при преобразовании. Теперь мой сайт /db находится в UTF-8, но, возможно, данные, представленные в форме, не были закодированы в кодировке UTF-8, возможно, они отправили ASCII или HEX, поэтому, возможно, мне нужно сначала преобразовать ее в UTF-8? Это означало бы какой-то код вроде:
$encoding = mb_detect_encoding($input);
$input = mb_convert_encoding($input, 'UTF-8', $encoding);
$input = htmlentities($input, ENT_QUOTES, 'UTF-8');
Да или нет? Тогда я все еще не уверен, как защитить от шестнадцатеричных, десятичных и base64 возможных входов XSS...
Если есть библиотека или PHP с открытым исходным кодом, которая может правильно защитить XSS, мне было бы интересно посмотреть, как они это делают в коде.
Любая помощь очень ценится, извините за длинный пост!