CodeIgniter - 为什么要使用xss_clean

问题描述 投票:26回答:5

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

php html security codeigniter xss
5个回答
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'>";
?>

只是很少:

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。您需要考虑如何使用数据以使用最佳功能。过滤输入的所有数据是一种不好的做法。它不仅不安全,而且还破坏了可能使比较变得困难的数据。


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()非常黑名单。


3
投票

我建议使用http://htmlpurifier.org/进行XSS纯化。我正在努力扩展我的CodeIgniter Input类以开始利用它。


2
投票

是的,你仍然应该使用它,我通常规定至少在面向公众的输入上使用它,这意味着任何人都可以访问和提交的任何输入。

通常,对DB查询的输入进行清理似乎是副作用,因为该函数的真正目的是阻止Cross-site Scripting Attacks

我不打算深入了解xss_clean所采取的每一步的细节,但我会告诉你它比你提到的几个步骤更多,我有pastied the source of the xss_clean function所以你可以看看自己,它是完全评论。


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

© www.soinside.com 2019 - 2024. All rights reserved.