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.您需要考虑如何使用数据以使用最佳功能.过滤输入的所有数据是一种不好的做法.它不仅不安全,而且还破坏了可能使比较变得困难的数据.
在您的情况下,"更严格的方法很好,重量更轻".CodeIgniter开发人员希望xss_clean()用于不同的用例,"允许'安全'HTML标记的评论系统或论坛".从文档中可以看出这一点,其中xss_clean显示应用于用户名字段.
还有另一个原因是永远不会使用xss_clean(),到目前为止还没有在stackoverflow上突出显示.xss_clean()在2011年和2012年期间被打破,并且无法完全修复.至少没有完全重新设计,这没有发生. 目前,它仍然容易受到这样的字符串的影响:
<a href="j&#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()非常黑名单.