论坛首页 编程语言技术论坛

关于XSS 攻击的解决办法!

浏览 13872 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (15) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-19   最后修改:2009-09-19
PHP
快到国庆了而且今年又是60周年,各个政府网站也都开始对网站的安全、漏洞进行大规模的扫描,很不幸我们公司开发的一个政府网站被扫描出来存在SQL注入、XSS、CSRF等漏洞!网站是几年前采用PHP开发的,由于开发人员本身的安全意识不足,代码编写上不严谨,滥用$_REQUEST类变量等导致网站存在了很多的安全隐患。最近一直都在研究XSS攻击如何防范,由于研究的时间不长简单的总结了下防御办法。
如下表单
<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攻击的一个简单总结,希望大家能够再多多补充。附一张扫描结果!
  • 大小: 38.7 KB
   发表时间:2009-09-19  
用户输入的内容必须经过html过滤,这是很基本的呀。

很多类库都有此功能。

最后,要确定表中存的数据是html转义后的还是转义前的,

如:存的是<>,  还是存的是&lt; &gt;
0 请登录后投票
   发表时间:2009-09-21  
xieye 写道
用户输入的内容必须经过html过滤,这是很基本的呀。

很多类库都有此功能。

最后,要确定表中存的数据是html转义后的还是转义前的,

如:存的是<>,  还是存的是&lt; &gt;


人是不可靠的,我更倾向于通过技术手段保障输出的合法性。

比如。使用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打开。
0 请登录后投票
   发表时间:2009-09-21  
不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。

为什么不能输入后过滤,是因为,今天可能是<>引起了问题, 明天可能会有更多的以前没有注意到的安全问题(例如&gt;也有问题了,仅仅举例子)。输入后过滤仅仅为了不要每次都过滤,省下了一些性能, 但是可以用生成静态文件,缓存等等方式解决的。

输出前过滤是最好的方法。
0 请登录后投票
   发表时间:2009-09-21  
xiaoyu 写道
不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。

为什么不能输入后过滤,是因为,今天可能是<>引起了问题, 明天可能会有更多的以前没有注意到的安全问题(例如&gt;也有问题了,仅仅举例子)。输入后过滤仅仅为了不要每次都过滤,省下了一些性能, 但是可以用生成静态文件,缓存等等方式解决的。

输出前过滤是最好的方法。

生成静态页面并不是很有效,有些功能比如:会员注册 是一定要进行输入验证的。
“输入后过滤仅仅为了不要每次都过滤 ”这句话有点不太理解哦!!
0 请登录后投票
   发表时间:2009-09-21  
xieye 写道
很多类库都有此功能。

能推荐几个吗??
0 请登录后投票
   发表时间:2009-09-21  
menuhin 写道
xiaoyu 写道
不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。

为什么不能输入后过滤,是因为,今天可能是<>引起了问题, 明天可能会有更多的以前没有注意到的安全问题(例如&gt;也有问题了,仅仅举例子)。输入后过滤仅仅为了不要每次都过滤,省下了一些性能, 但是可以用生成静态文件,缓存等等方式解决的。

输出前过滤是最好的方法。

生成静态页面并不是很有效,有些功能比如:会员注册 是一定要进行输入验证的。
“输入后过滤仅仅为了不要每次都过滤 ”这句话有点不太理解哦!!



这个数据验证和所说的过滤不是一回事呀。。。。。, 我没有说不要输入的时候验证, 但是不要做过滤那些XSS的标签。

因为如果在输出前进行转换的话(转换掉XSS的标签),要每次都要做,所以可以用上面的某些方法避免。如果在输入后就转化,拿输出就不用每次都转化了。

静态和缓存又不是锤子,什么都能锤。

0 请登录后投票
   发表时间: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;
        }



0 请登录后投票
   发表时间:2009-09-22  
微软有个Anti-Cross Site Scripting Library 是.net托管程序集 反编译一下照着画成php的就基本能用了
0 请登录后投票
   发表时间:2009-09-22  
php里要解决xss比较好的方案是用HTML Purifier,它过滤xss,还可以自动填补没关闭的标签。。自定义过滤规则,很强大
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics