Php CodeIgniter-为什么要使用xss_clean

Php CodeIgniter-为什么要使用xss_clean,php,html,security,codeigniter,xss,Php,Html,Security,Codeigniter,Xss,如果我正在清理我的数据库插入,并转义我用htmlentities($text,ENT\u COMPAT,'UTF-8')编写的HTML,那么还需要用xss\u clean过滤输入吗?它还能带来什么其他好处?是的,您应该仍然使用它,我通常规定至少在面向公众的输入上使用它,这意味着任何人都可以访问和提交任何输入 一般来说,清理DB查询的输入似乎是一个副作用,因为函数的真正目的是防止 我不打算深入讨论XSU clean采取的每一步的细节,但我会告诉你,它比你提到的几个步骤做得更多,我已经(死链接),所

如果我正在清理我的数据库插入,并转义我用
htmlentities($text,ENT\u COMPAT,'UTF-8')
编写的HTML,那么还需要用xss\u clean过滤输入吗?它还能带来什么其他好处?

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

一般来说,清理DB查询的输入似乎是一个副作用,因为函数的真正目的是防止

我不打算深入讨论XSU clean采取的每一步的细节,但我会告诉你,它比你提到的几个步骤做得更多,我已经(死链接),所以你可以看看自己,这是完全的评论。

是广泛的,也是愚蠢的。此函数的90%不会阻止xss。例如查找单词
alert
,但不查找
document.cookie
。没有黑客会在他们的攻击中使用
警报
,他们会用xss劫持cookie或读取CSRF令牌来生成XHR

但是,使用它运行
htmlspecialchars()
htmlspecialchars()
是多余的。
xss_clean()
修复了问题,而
htmlentities($text,ENT_COMPAT,'UTF-8')
失败的情况如下:

<?php
print "<img src='$var'>";
?>

一个简单的poc是:

“%20onload=警报(/xss/)

这将把
onload=
事件处理程序添加到图像标记中。停止这种形式的xss的方法是
htmlspecialchars($var,ENT_QUOTES)
或在这种情况下
xss_clean()
也会阻止这种情况发生

但是,引用xss_clean()文档:

当然,没有什么是100%万无一失的 当然,但我一直没能拿到 任何东西都能通过过滤器

也就是说,XSS是一个
输出问题
而不是
输入问题
。例如,此函数不能考虑变量已经在
标记或事件处理程序中。它也不会停止基于DOM的XSS。为了使用最佳功能,您需要考虑如何使用数据。过滤输入上的所有数据是一种不良做法。它不仅不安全,而且还会破坏数据,从而使比较变得困难

我建议用它来做XSS纯化。我正在扩展我的CodeIgniter输入类以开始利用它。

在您的例子中。CodeIgniter开发人员打算将xss_clean()用于不同的用例,“一个允许“安全”HTML标记的评论系统或论坛”。文档中没有明确说明这一点,其中显示xss_clean应用于用户名字段

还有另一个不使用xss_clean()的原因,到目前为止,在stackoverflow上还没有突出显示。xss_clean()在和期间损坏,无法完全修复。至少没有一个完整的重新设计,这没有发生


xss_clean()的当前实现从有效地将urldecode()和html_entity_decode()应用于整个字符串开始。这是必需的,这样它就可以对“javascript:”之类的内容进行简单的检查。最后,它返回已解码的字符串

攻击者可以简单地对其攻击进行两次编码。它将被xss_clean()解码一次,并作为clean传递。然后您就有了一个单独编码的漏洞,可以在浏览器中执行


我称这些检查为“幼稚”和不可调整的,因为它们在很大程度上依赖于正则表达式。HTML不是一种常规语言;xss_clean()没有类似的内容。也许可以将HTML的一个子集列为白名单,它可以用正则表达式清晰地表达。但是,当前的xss_clean()是一个黑名单。

如果希望过滤器在每次遇到POST或COOKIE数据时自动运行,可以通过打开应用程序/config/config.php文件并设置以下内容来启用它: $config['global_xss_filtering']=TRUE

通过打开应用程序/config/config.php文件并设置以下内容,可以启用csrf保护: $config['csrf_protection']=TRUE

有关更多详细信息,请参阅以下链接


htmlentities($text,ENT\u COMPAT,'UTF-8')
不是阻止xss的好方法,任何人都不应该使用它。
htmlentities
绝对是防止HTML注入的证据,但是如果使用单引号属性分隔符,则需要使用
ENT\u QUOTES
而不是
ENT\u COMPAT
htmlspecialchars
通常比
htmlentities
更可取,因为它不太可能弄乱字符集。CodeIgniter的
xss_clean
是一个毫无价值的货运邪教编程灾难区,充满了对字符串处理的错误理解。xss是一个输出问题,而不是输入问题,这就是为什么像
xss_clean()
这样的东西永远不能成为解决xss问题的可靠方法(和
xss_clean()
本身就是一个可笑的可怕的实现,即使是低标准的反XSS工具)。我很惊讶你在第一句话中似乎支持它作为输出级转义的更好的替代方法。@b请确认你的回答完全正确。事实上,在xss_clean()中进行的90%的检查对安全性没有任何作用。例如查找
alert()
,但不查找
document.cookie
。但后来在我的帖子中,我确实说过xss是一个输出问题,我知道xss在哪里是可能的,只有一种方法。但我会更新这篇文章。谢谢,这样更好!实际上,当前版本的
xss_clean
看起来确实在查找
document.cookie
。。。虽然很明显,这仍然是完全无用的,因为它无法捕获
文档。cookie
文档['cookie']
或其他一千种你可以引用它的方式中的任何一种。@bobince哈,是的,这是徒劳的尝试
<a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a>