锁定老帖子 主题:关于XSS 攻击的解决办法!
精华帖 (0) :: 良好帖 (1) :: 新手帖 (15) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-19
最后修改:2009-09-19
如下表单 <form name="testform" method="post" action="news/comment.php"> <input type="text" name="userName"> <input type="hidden" name="test1" /> <input type="hidden" name="test2" /> </form> 如果在用户在输入用户时录入的数据为" /><script src=xxx></script>这样就会插入了恶意的脚本 解决办法: 1、对用户录入的数据进行类型和长度的验证,其它的包括对URL、查询关键字、HTTP头、get、post也需要进行可靠的输入验证,这样可以抵挡部分恶意的脚本,但是不能完全防住。 2、尽量采用POST方式而非GET方式提交表单;对”<”,”>”,”;”,”’”等字符做过滤;任何内容输出到页面之前都必须加以encode。对于Cookie 尽量避免直接泄露用户隐私,可以用cookie结合其它一些系统或用户信息来降低泄露后的危险。 3、这里要注意一下如果注入代码如<img src="javascript:alert('XSS')">这种需要把关键字去除如 src href 这些连接性的 发现没有带协议头的就需要帮助补充。而style 则需要重点处理 /**/ expression url,尽可能禁止style属性,将所有的样式都定义到CSS中。 4、尽量减少在客户端进行写document等敏感操作,重点关注以下方法 document.URL document.URLUnencoded document.location () document.referrer window.location () document.create...()等 逐层进行过滤客户端、服务器端、数据库访问层,每一层都进行下数据的过滤尽量将危险控制在最低。 以上是对XSS攻击的一个简单总结,希望大家能够再多多补充。附一张扫描结果! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-19
用户输入的内容必须经过html过滤,这是很基本的呀。
很多类库都有此功能。 最后,要确定表中存的数据是html转义后的还是转义前的, 如:存的是<>, 还是存的是< > |
|
返回顶楼 | |
发表时间:2009-09-21
xieye 写道 用户输入的内容必须经过html过滤,这是很基本的呀。
很多类库都有此功能。 最后,要确定表中存的数据是html转义后的还是转义前的, 如:存的是<>, 还是存的是< > 人是不可靠的,我更倾向于通过技术手段保障输出的合法性。 比如。使用xml 模板引擎,你想写出具有xss漏洞的网页都难。 顺便推荐一下Lite XML: http://www.iteye.com/news/10422-lite 对于PHP环境,开源的版本性能不如smarty,目前有一个专门的优化版本 lite2php,综合性能大概是smarty的6倍,不过现在还没有对外开放,透露一点测试数据: http://templatetest.googlecode.com/svn/trunk/TT/web/lite2php-smarty/stat/index.html 这个连接只能用ie打开。 |
|
返回顶楼 | |
发表时间:2009-09-21
不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。
为什么不能输入后过滤,是因为,今天可能是<>引起了问题, 明天可能会有更多的以前没有注意到的安全问题(例如>也有问题了,仅仅举例子)。输入后过滤仅仅为了不要每次都过滤,省下了一些性能, 但是可以用生成静态文件,缓存等等方式解决的。 输出前过滤是最好的方法。 |
|
返回顶楼 | |
发表时间:2009-09-21
xiaoyu 写道 不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。
为什么不能输入后过滤,是因为,今天可能是<>引起了问题, 明天可能会有更多的以前没有注意到的安全问题(例如>也有问题了,仅仅举例子)。输入后过滤仅仅为了不要每次都过滤,省下了一些性能, 但是可以用生成静态文件,缓存等等方式解决的。 输出前过滤是最好的方法。 生成静态页面并不是很有效,有些功能比如:会员注册 是一定要进行输入验证的。 “输入后过滤仅仅为了不要每次都过滤 ”这句话有点不太理解哦!! |
|
返回顶楼 | |
发表时间:2009-09-21
xieye 写道 很多类库都有此功能。
能推荐几个吗?? |
|
返回顶楼 | |
发表时间:2009-09-21
menuhin 写道 xiaoyu 写道 不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。
为什么不能输入后过滤,是因为,今天可能是<>引起了问题, 明天可能会有更多的以前没有注意到的安全问题(例如>也有问题了,仅仅举例子)。输入后过滤仅仅为了不要每次都过滤,省下了一些性能, 但是可以用生成静态文件,缓存等等方式解决的。 输出前过滤是最好的方法。 生成静态页面并不是很有效,有些功能比如:会员注册 是一定要进行输入验证的。 “输入后过滤仅仅为了不要每次都过滤 ”这句话有点不太理解哦!! 这个数据验证和所说的过滤不是一回事呀。。。。。, 我没有说不要输入的时候验证, 但是不要做过滤那些XSS的标签。 因为如果在输出前进行转换的话(转换掉XSS的标签),要每次都要做,所以可以用上面的某些方法避免。如果在输入后就转化,拿输出就不用每次都转化了。 静态和缓存又不是锤子,什么都能锤。 |
|
返回顶楼 | |
发表时间:2009-09-22
menuhin 写道 xieye 写道 很多类库都有此功能。
能推荐几个吗?? 我只会用最简单最傻瓜的。目的:过滤html标签和属性,方式:只允许白名单 Zend类库。 首先要加载Zend,就不多说了,然后,下面的代码摘抄自《php Web 2.0开发指南》 protected function cleanHtml($html) { $chain = new Zend_Filter(); $tags = array( 'a' => array('href', 'target', 'style'), 'img' => array('src', 'alt' ,'style', 'width', 'height'), 'b' => array('style'), 'strong' => array('style'), 'em' => array('style'), 'i' => array(), 'ul' => array('style'), 'li' => array('style'), 'ol' => array('style'), 'p' => array('style'), 'br' => array(), 'font' => array('size' , 'color', 'style'), 'div' => array('style'), 'span' => array('style'), 'center' => array(), 'h1' => array('style'), 'h2' => array('style'), 'h3' => array('style'), 'h4' => array('style'), 'h5' => array('style'), 'h6' => array('style'), 'table' => array( 'bgcolor', 'border', 'cellpadding', 'cellspacing',), 'tbody' => array('style', 'align', 'valign'), 'tr' => array('style', 'align', 'bgcolor', 'valign'), 'td' => array('style', 'align', 'bgcolor', 'colspan', 'height', 'nowrap', 'rowspan', 'scope', 'valign', 'width'), 'th' => array('style', 'align', 'bgcolor', 'colspan', 'height', 'nowrap', 'rowspan', 'scope', 'valign', 'width'), 'thead' => array('style'), ); $chain->addFilter(new Zend_Filter_StripTags($tags)); $chain->addFilter(new Zend_Filter_StringTrim()); $html = $chain->filter($html); $tmp = $html; while (1) { // Try and replace an occurrence of javascript: $html = preg_replace('/(<[^>]*)javascript:([^>]*>)/i', '$1$2', $html); // If nothing changed this iteration then break the loop if ($html == $tmp) break; $tmp = $html; } return $html; } |
|
返回顶楼 | |
发表时间:2009-09-22
微软有个Anti-Cross Site Scripting Library 是.net托管程序集 反编译一下照着画成php的就基本能用了
|
|
返回顶楼 | |
发表时间:2009-09-22
php里要解决xss比较好的方案是用HTML Purifier,它过滤xss,还可以自动填补没关闭的标签。。自定义过滤规则,很强大
|
|
返回顶楼 | |