如果我正在清理我的数据库插入,并且还转义了我用htmlentities($text, ENT_COMPAT, 'UTF-8')
编写的HTML - 是否还要用xss_clean过滤输入?它还带来了哪些其他好处?
答案 0 :(得分:46)
xss_clean()广泛而且愚蠢。 90%的此功能无法阻止xss。例如,查找单词alert
,而不是document.cookie
。没有黑客会在他们的漏洞利用中使用alert
,他们会用xss劫持cookie或者读取CSRF令牌来制作XHR。
但是,使用它运行htmlentities()
或htmlspecialchars()
是多余的。 xss_clean()
解决问题且htmlentities($text, ENT_COMPAT, 'UTF-8')
失败的情况如下:
<?php
print "<img src='$var'>";
?>
一个简单的poc是:
http://localhost/xss.php?var=http://domain/some_image.gif“%20onload =警报(/ XSS /)
这会将onload=
事件处理程序添加到图像标记中。阻止这种形式的xss的方法是htmlspecialchars($var,ENT_QUOTES);
,或者在这种情况下,xss_clean()
也会阻止这种情况。
但是,引用xss_clean()文档:
没有什么是万无一失的 当然,但我没能得到 任何东西都通过过滤器。
话虽如此,XSS是output problem
不和input problem
。例如,此函数不能考虑变量已经在<script>
标记或事件处理程序中。它也不会停止基于DOM的XSS。您需要考虑如何使用数据以使用最佳功能。过滤所有输入数据是不良做法。它不仅不安全,而且还破坏了可能使比较变得困难的数据。
答案 1 :(得分:6)
在您的情况下,"stricter methods are fine, and lighter weight"。 CodeIgniter开发人员希望xss_clean()用于不同的用例,“允许'安全'HTML标记的评论系统或论坛”。这一点在文档中并不清楚,其中xss_clean显示应用于用户名字段。
还有另一个原因是永远不会使用xss_clean(),到目前为止还没有在stackoverflow上突出显示。 xss_clean()在2011和2012期间被破坏,并且无法完全修复。至少没有完全重新设计,这没有发生。 At the moment, it's still vulnerable to strings like this:
<a href="j&#x41;vascript:alert%252831337%2529">Hello</a>
xss_clean()的当前实现首先将urldecode()和html_entity_decode()有效地应用于整个字符串。这是必需的,所以它可以使用天真的检查,如“javascript:”。最后,返回解码后的字符串。
攻击者可以简单地对其漏洞进行两次编码。它将由xss_clean()解码一次,并传递为干净。然后,您将拥有一个单独编码的漏洞利用程序,可以在浏览器中执行。
我称这些检查“天真”并且无法修复,因为它们在很大程度上依赖于正则表达式。 HTML不是常规语言。 You need a more powerful parser to match the one in the browser; xss_clean()没有这样的东西。也许可以将HTML的一个子集列入白名单,这可以用正则表达式清晰地表达。但是,当前的xss_clean()非常黑名单。
答案 2 :(得分:3)
我建议使用http://htmlpurifier.org/进行XSS纯化。我正在努力扩展我的CodeIgniter输入类以开始利用它。
答案 3 :(得分:2)
是的,你仍然应该使用它,我通常规定至少在面向公众的输入上使用它,这意味着任何人都可以访问和提交的任何输入。
通常对数据库查询的输入进行清理似乎是一种副作用,因为该函数的真正目的是阻止Cross-site Scripting Attacks。
我不会深入了解xss_clean所采取的每一步的细节,但我会告诉你它比你提到的几个步骤更多,我pastied the source of the xss_clean function所以你可以看看自己,它被完全评论。
答案 4 :(得分:0)
如果您希望过滤器每次遇到POST或COOKIE数据时自动运行,您可以通过打开application / config / config.php文件并设置它来启用它: $ config ['global_xss_filtering'] = TRUE;
您可以通过打开application / config / config.php文件并设置以下内容来启用csrf保护: $ config ['csrf_protection'] = TRUE;
有关详细信息,请参阅以下链接。
https://ellislab.com/codeigniter/user-guide/libraries/security.html