XSS基本处理(转义和过滤)

上一篇 / 下一篇  2012-06-06 17:55:53 / 个人分类:web测试

关于XSS的问题,基本处理方法如下:

1 对于在页面上展示的内容,如果有内容来自用户输入,需要做htmlentities(在utf8编码下,htmlspecialchars也可,但htmlspecialchars对于其他某些编码会有问题)处理,但这个只应该在展示的时候进行。

2 如果页面上有出现在<script>中的变量,最好不要有来自用户输入,如果有要做尽可能严格的过滤,htmlentities不能解决script中的问题,事实上,由于eval等方法的存在,现在没法过滤所有的js,所以js中最好不要有直接来自用户的内容。

3 对于出现在css属性中的变量,最好不要有来自用户的输入,css的表达式可以起到和js类似的效果,htmlentities无能为力。

4 对于url(包括imgsrc),做尽可能严格的限制,url可以通过302跳转等方式向页面引入新的js,最好限制在我们认可的域名范围内。

5补充一种情况:

* 如果表单中有变量,例如<input value="htmlspecialchars($foo)">这种情况,一定要使用双引号,htmlentities等不会转义单引号。如果使用单引号,用户可以通过<input value=’’ nfocous=’alert()’(红色为输入部分)的形式来执行代码。

 

 

对于简单的输入,可以考虑用strip_tags过滤掉所有标签能防止部分问题,但几乎所有过滤器对于类似<input value="$foo">这种情况无能为力,因为这种情况下不需要采用括号就能将一段代码(如$foo = " nfocus="alert())注入,只能考虑在输出到页面的时候进行编码等操作。

 

过滤:

我们这里采用的是htmlpurifier,适合进行大段文字的过滤,对于小段文字效率不高,使用方法如下

Tools_Purifier::clean($dirty_html,$config)
示例:

Tools_Purifier::clean($html,array('HTML.Allowed'=>'')); //不允许任何标签
Tools_Purifier::clean('asf<img src="" style="width:30px;"><a href="bcd" title="dd">tt</a><script>asa</script>',array('HTML.Allowed'=>'a[href|title],img[src|style]')); //只允许a标签中的href titile和img中的src style

更多设置请参考官方文档http://htmlpurifier.org/live/configdoc/plain.html

另外,据说thinkphp提供了这么一个过滤方法,速度也不快,但是比较强力,对一些可能正常的输入也进行了额外的处理,可以参考,这里也提供了一个封装

Tools_Purifier::removeXSS($dirty_html)
参考:

  • http://ha.ckers.org/xss.html
  • http://stackoverflow.com/questions/3605629/php-prevent-xss-with-strip-tags
  • https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.230_-_Never_Insert_Untrusted_Data_Except_in_Allowed_Locations

  • TAG:

     

    评分:0

    我来说两句

    Open Toolbar