CodeIgniter - 为什么要使用xss_clean

Dan*_*rle 26 html php security xss codeigniter

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

roo*_*ook 46

xss_clean()很广泛,而且很傻.90%的此功能无法阻止xss.比如寻找这个词alert 但不是document.cookie.没有黑客会alert在他们的漏洞利用中使用,他们会用xss劫持cookie或者读取CSRF令牌来制作XHR.

无论是跑步htmlentities()还是跑步htmlspecialchars()都是多余的.其中A的情况下xss_clean()解决这一问题,htmlentities($text, ENT_COMPAT, 'UTF-8') 失败如下:

<?php
print "<img src='$var'>";
?>
Run Code Online (Sandbox Code Playgroud)

一个简单的poc是:

http://localhost/xss.php?var = http: //domain/some_image.gif'%20onload = alert(/ xss /)

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

但是,引用xss_clean()文档:

当然,没有什么是万无一失的,但是我无法通过过滤器获得任何东西.

话虽这么说,XSS output problem 不是一个input problem.例如,此函数不能考虑变量已经在<script>标记或事件处理程序中.它也不会停止基于DOM的XSS.您需要考虑如何使用数据以使用最佳功能.过滤输入的所有数据是一种不好的做法.它不仅不安全,而且还破坏了可能使比较变得困难的数据.

  • XSS*是一个输出问题,而不是输入问题,这就是为什么像`xss_clean()`这样的东西*永远不会成为解决XSS问题的可靠方法(而且`xss_clean()`本身是一个可笑的可怕实现,即使是反XSS工具的低,低标准).我很惊讶你似乎认可它是你的第一句话中输出级逃避的一个更好的选择. (4认同)
  • 谢谢,那更好!实际上,当前版本的`xss_clean`似乎确实在寻找`document.cookie` ...虽然显然这仍然完全没用,因为它不会捕获`文档.cookie`,`document ['cookie']`或你可以引用它的其他千种方式. (3认同)
  • @bobince你的完全正确.实际上,在xss_clean()中进行的检查中,90%都没有为安全做任何事情.比如寻找`alert()`而不是`document.cookie`.但后来在我的帖子中我确实说过xss是一个输出问题,并且只有一种方法我知道xss可能在哪里.我会更新这篇文章. (2认同)

sou*_*edi 6

在您的情况下,"更严格的方法很好,重量更轻".CodeIgniter开发人员希望xss_clean()用于不同的用例,"允许'安全'HTML标记的评论系统或论坛".从文档中可以看出这一点,其中xss_clean显示应用于用户名字段.

还有另一个原因是永远不会使用xss_clean(),到目前为止还没有在stackoverflow上突出显示.xss_clean()在2011年2012年期间被打破,并且无法完全修复.至少没有完全重新设计,这没有发生. 目前,它仍然容易受到这样的字符串的影响:

<a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a>
Run Code Online (Sandbox Code Playgroud)

xss_clean()的当前实现首先将urldecode()和html_entity_decode()有效地应用于整个字符串.这是必需的,所以它可以使用天真的检查,如"javascript:".最后,它返回解码后的字符串.

攻击者可以简单地对其漏洞进行两次编码.它将由xss_clean()解码一次,并传递为干净.然后,您将拥有一个单独编码的漏洞,可以在浏览器中执行.

我称这些检查"天真"并且无法修复,因为它们在很大程度上依赖于正则表达式.HTML不是常规语言. 您需要一个更强大的解析器来匹配浏览器中的解析器 ; xss_clean()没有这样的东西.也许可以将HTML的一个子集列入白名单,这可以用正则表达式清晰地表达.但是,当前的xss_clean()非常黑名单.