CodeIgniter - 为什么要使用xss_clean

时间:2011-03-17 09:26:23

标签: php html security codeigniter xss

如果我正在清理我的数据库插入,并且还转义了我用htmlentities($text, ENT_COMPAT, 'UTF-8')编写的HTML - 是否还要用xss_clean过滤输入?它还带来了哪些其他好处?

5 个答案:

答案 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()在20112012期间被破坏,并且无法完全修复。至少没有完全重新设计,这没有发生。 At the moment, it's still vulnerable to strings like this:

<a href="j&#x26;#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