Безопасная функция очистки XSS (регулярно обновляется)

Я уже несколько дней рыскал в сети, пытаясь понять это, но получаю противоречивые ответы.

есть ли библиотека, класс или функция для PHP, которая безопасно дезинфицирует / кодирует строку против XSS? Его необходимо регулярно обновлять, чтобы противостоять новым атакам.

У меня есть несколько вариантов использования:

Вариант использования 1) У меня есть текстовое поле, например, для имени или фамилии

  • пользователя. вводит текст в поле и отправляет форму.
  • Перед сохранением в базе данных я хочу a) обрезать все пробелы спереди и конец строки и б) удаляют все теги HTML из ввода. Это текстовое поле имени, в нем не должно быть HTML.
  • Затем я сохраню это в базе данных с подготовленными операторами PDO.

Думаю, я мог бы просто сделать trim () и strip_tags () затем используйте фильтр очистки или RegEx с белым списком символов. Неужели им нужны такие персонажи! и ? или > в их имени, не совсем.

Вариант использования 2) При выводе содержимого из ранее сохраненной записи базы данных (или из ранее отправленной формы) в представление / HTML Я хочу тщательно очистить его от XSS. NB: Он мог пройти или не прошел этап фильтрации в варианте использования 1, так как это мог быть другой тип ввода, поэтому предположим, что никакая очистка не проводилась.

Первоначально я думал, что HTMLPurifier подойдет работа, но, похоже, это не то, что мне нужно, когда я задал вопрос их службе поддержки :

Вот лакмусовая бумажка: если пользователь отправит foo должен ли он отображаться как foo или foo ? В первом случае вам не нужен очиститель HTML.

Поэтому я бы предпочел, чтобы он отображался как foo , потому что я не хочу, чтобы какой-либо 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 вместо упомянутого в нескольких местах в Stack Overflow , потому что он более безопасен, чем htmlspecialchars.

  • Итак, как мне использовать htmlentities правильно?
  • Это все, что мне нужно?
  • Как он защищает от отправляемых шестнадцатеричных, десятичных и кодированных значений base64 атак, перечисленных здесь ?

Теперь я вижу, что третий параметр для метода 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, мне было бы интересно посмотреть, как сделайте это в коде.

Любая помощь очень ценится, извините за длинный пост!

14
задан Community 23 May 2017 в 12:24
поделиться