Безопасная функция очистки XSS (регулярно обновляется) - PullRequest
14 голосов
/ 17 июня 2011

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

Существует ли библиотека, класс или функция для 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, мне было бы интересноПосмотрите, как они делают это в коде.

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

Ответы [ 2 ]

24 голосов
/ 17 июня 2011

Чтобы ответить на смелый вопрос: да, есть.Он называется htmlspecialchars.

. Он должен регулярно обновляться для противодействия новым атакам.

Правильный способ предотвращения атак XSS непротиводействие определенным атакам, фильтрация / очистка данных, но правильное кодирование , повсюду.

htmlspecialchars (или htmlentities) в сочетании с разумным решением кодировки символов (то есть UTF-8) и явной спецификации кодировки символов достаточно для предотвращения всех атак XSS.К счастью, вызов htmlspecialchars без явного кодирования (тогда предполагается, что ISO-8859-1) работает и для UTF-8.Если вы хотите сделать это явным, создайте вспомогательную функцию:

// Don't forget to specify UTF-8 as the document's encoding
function htmlEncode($s) {
    return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}

О, и для решения проблем, связанных с формой: не пытайтесь обнаруживать кодировки, это обязательно приведет к сбою.Вместо этого выдают форму в UTF-8.Каждый браузер будет отправлять пользовательские данные в UTF-8.

Для решения конкретных проблем:

(...) вы должны использовать htmlentities, потому что htmlspecialchars уязвима для UTF-7 Эксплойт XSS.

Эксплойт XSS UTF-7 может применяться только в том случае, если браузер считает, что документ закодирован в UTF-7.Указание кодировки документа как UTF-8 (в заголовке HTTP / метатеге сразу после <head>) предотвращает это.

Также, если я не обнаруживаю кодировку, что должно остановить злоумышленниказагрузить файл html, затем изменить его на UTF-7 или другую кодировку, а затем отправить запрос POST обратно на мой сервер со страницы измененного html?

Этот сценарий атаки неоправданно сложен.Злоумышленник может просто создать строку UTF-7, не нужно ничего загружать.

Если вы принимаете POST атакующего (т. Е. Вы принимаете анонимный публичный ввод данных пользователем), ваш сервер будет просто интерпретировать UTF-7Строка как странная UTF-8.Это не проблема, пост злоумышленника просто покажет искаженный.Злоумышленник может добиться того же эффекта (отправив странный текст), отправив «grfnlk» сто раз.

Если мой метод работает только для UTF-8, тогда атака XSS пройдет, не так ли?

Нет, не будет.Кодировки не являются магией.Кодировка - это просто способ интерпретации двоичной строки.Например, строка «ö» кодируется как (шестнадцатеричное) 2B 41 50 59 в UTF-7 (и C3 B6 в UTF-8).Декодирование 2B 41 50 59 как UTF-8 дает "+ APY" - безвредные, казалось бы, случайные символы.

Кроме того, как htmlentities защищает от HEX или других атак XSS?

Шестнадцатеричные данные будут выводиться именно так.Злоумышленник, отправляющий «3С», отправит сообщение «3С».«3C» может только стать <, если вы активно пытаетесь интерпретировать шестнадцатеричные входные данные, например, активно отображать их в кодовые точки Unicode и затем выводить их.Это просто означает, что если вы принимаете данные во что-то, кроме простого UTF-8 (например, UTF-8 в кодировке base32), вам сначала нужно будет распаковать кодировку, а , а затем использовать htmlspecialchars, прежде чемвключая его между кодом HTML.

0 голосов
/ 06 мая 2014

Многие специалисты по безопасности рекомендуют использовать эту библиотеку для решения этой конкретной проблемы:

https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

...