Я уже несколько дней слоняюсь по сети, пытаясь выяснить это, но получая противоречивые ответы.
Существует ли библиотека, класс или функция для 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 Purifier.
Так что я бы предпочел, чтобы он отображался как <b>foo</b>
, потому что я не хочу, чтобы какой-либо HTML отображался для простого текстового поля или любого JavaScriptexecuting.
Так что я искал функцию, которая сделает все это за меня.Я наткнулся на метод 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?
- Это так?все, что мне нужно?
- Как он защищает от шестнадцатеричных, десятичных и base64-кодированных значений, отправляемых из перечисленных атак здесь ?
Теперь я вижу, что3-й параметр для метода 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');
Да или нет?Тогда я все еще не уверен, как защитить от возможных XSS-входов в шестнадцатеричном, десятичном и Base64-разрядах ...
Если есть какая-то библиотека или среда PHP с открытым исходным кодом, которая может правильно выполнять защиту XSS, мне было бы интересноПосмотрите, как они делают это в коде.
Любая помощь высоко ценится, извините за длинный пост!