`
menuhin
  • 浏览: 26288 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

关于XSS 攻击的解决办法!

    博客分类:
  • java
阅读更多
快到国庆了而且今年又是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
分享到:
评论
17 楼 xiaoyu 2009-12-11  
问题我说了, 是安全问题, 还有法律问题。 自己看吧
16 楼 xieye 2009-10-26  
xiaoyu 写道
不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。

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

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




保存到数据库之前过滤有一个很大的好处,就是显示的地方多,不需要在每个显示的地方,模板的代码简单些,而插入的代码只在一个地方。

而php自带的函数可以正反切换,如果需要原来字符的话调一下好了。

所以没有一定最好的办法。


15 楼 cfc4nl 2009-10-21  
SafeHtml 可以不???
HTML富文本过滤的...我觉得不错
这里有介绍http://www.80sec.com/richtext-xssfilter.html
14 楼 ccxw1983 2009-09-30  
提交表单可以用httpclient类的工具来实现的,所以页面上判断是肯定不够的,要防注入就得在后台接收表单的时候处理下,或者对要执行的sql进行检查。
13 楼 icyleaf 2009-09-29  
htmlspecialchars 函数不行么?
12 楼 savasun 2009-09-23  
menuhin 写道
活靶子 写道
微软有个Anti-Cross Site Scripting Library 是.net托管程序集 反编译一下照着画成php的就基本能用了

嗯,这个我前几天在MSDN里也有看到过!MS不错的!!

这个作为项目的检测和修改成本太高。不过确实值得一试
11 楼 menuhin 2009-09-22  
活靶子 写道
微软有个Anti-Cross Site Scripting Library 是.net托管程序集 反编译一下照着画成php的就基本能用了

嗯,这个我前几天在MSDN里也有看到过!MS不错的!!
10 楼 menuhin 2009-09-22  
willko 写道
php里要解决xss比较好的方案是用HTML Purifier,它过滤xss,还可以自动填补没关闭的标签。。自定义过滤规则,很强大

哈哈,刚看了下,确实不错!谢谢兄弟了!
9 楼 willko 2009-09-22  
php里要解决xss比较好的方案是用HTML Purifier,它过滤xss,还可以自动填补没关闭的标签。。自定义过滤规则,很强大
8 楼 活靶子 2009-09-22  
微软有个Anti-Cross Site Scripting Library 是.net托管程序集 反编译一下照着画成php的就基本能用了
7 楼 xieye 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;
        }



6 楼 xiaoyu 2009-09-21  
menuhin 写道
xiaoyu 写道
不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。

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

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

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



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

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

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

5 楼 menuhin 2009-09-21  
xieye 写道
很多类库都有此功能。

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

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

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

生成静态页面并不是很有效,有些功能比如:会员注册 是一定要进行输入验证的。
“输入后过滤仅仅为了不要每次都过滤 ”这句话有点不太理解哦!!
3 楼 xiaoyu 2009-09-21  
不要再输入后过滤,然后存到数据库里面, 这样的危险性很大,而且数据不能跨平台(非HTML的客户端)。

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

输出前过滤是最好的方法。
2 楼 jindw 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打开。
1 楼 xieye 2009-09-19  
用户输入的内容必须经过html过滤,这是很基本的呀。

很多类库都有此功能。

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

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

相关推荐

    防止XSS攻击解决办法

    防止XSS攻击是保护Web应用安全的重要一环,对于任何Web开发者来说都是必备的知识。 一、XSS攻击类型 XSS攻击主要分为三类:反射型XSS、存储型XSS和DOM型XSS。 1. 反射型XSS:攻击者通过构造恶意链接,诱使用户点击...

    奇安信安全扫描漏洞解决路径遍历和存储型xss和反射xss攻击漏洞

    亲测可用,中级漏洞,解决服务器段请求伪造 final String forURL = ESAPI.encoder().encodeForURL(url); restTemplate.exchange(forURL, HttpMethod.GET,new HttpEntity&lt;String&gt;(headers), List.class, params);

    JSP Struts过滤xss攻击的解决办法

    JSP Struts过滤xss攻击的解决办法 本方案采用struts2的拦截器过滤,将提交上来的参数转码来解决。 配置struts.xml extends=struts-default,&gt; &lt;!-- 配置拦截器 --&gt; &lt;!-- 定义xss拦截器 --&gt; ...

    WEB前端常见受攻击方式及解决办法总结

    【WEB前端常见受攻击方式及解决办法】 WEB前端的安全问题不容忽视,因为它直接影响到用户的个人信息安全和网站的正常运行。本文主要关注四种常见的攻击方式及其防范措施:SQL注入、跨站脚本攻击(XSS)、跨站请求...

    Web开发中常见的安全缺陷及解决办法[收集].pdf

    本篇文章主要探讨了两个关键知识点:一是不能盲目信任用户输入,二是五种常见的ASP.NET安全缺陷及其解决办法。 首先,我们了解为什么不能盲目相信用户输入。Web应用程序常常依赖用户提供的数据来执行各种操作,如...

    学习总结:前端跨域请求的解决办法——JSONP

    3. **安全性**:由于服务器直接返回可执行的JavaScript代码,存在被XSS攻击的风险。 4. **无错误处理**:如果服务器返回的不是预期的函数调用格式,前端无法捕获错误。 ### JSONP与CORS的区别 相比于JSONP,CORS...

    PHP语言开发常见问题解决办法入门总结.docx

    - 在处理用户输入时,使用过滤函数如`filter_var`来预防XSS攻击。 - 在处理文件上传时,需要检查文件类型和大小限制,以防止恶意文件被上传。 - **示例代码**: ```php // 过滤用户输入 $username = filter_...

    网页制作中Iframe自适应高度的解决办法

    // 验证来源以防XSS攻击 iframe.style.height = event.data.height + 'px'; }, false); ``` 总的来说,解决Iframe自适应高度的问题,可以采用JavaScript监听加载事件、CSS布局或者跨域通信等多种方式,具体选择...

    VB.NET,ASP.NET,SQL数据库实际应用中的典型问题及解决办法

    - **XSS攻击**:防止跨站脚本攻击,对用户输入进行HTML编码或使用验证控件。 - **CSRF攻击**:添加令牌验证,防止跨站请求伪造。 - **权限控制**:根据用户角色分配权限,限制敏感操作。 6. **性能调优** - **...

    源碼安全修正PDF說明

    - **解决办法**: 使用CSRF令牌验证机制,确保每次敏感操作都携带一个唯一的令牌,并且该令牌必须与用户的会话状态相匹配。 #### 5. **认证误用 (Often Misused: Authentication)** - **定义**: 认证机制设计不当或...

    ajax跨域问题的解决办法.rar

    允许跨域可能会使服务器暴露于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等风险,因此在设置CORS时应谨慎考虑允许的源和方法。 总结,解决Ajax跨域问题有多种方法,选择哪种取决于项目需求和安全考虑。JSONP适用于...

    asp.net中“从客户端中检测到有潜在危险的Request.Form值”错误的解决办法

    asp.net中的请求验证特性提供了某一等级的保护措施防止XSS攻击,asp.net的请求验证是默认启动的。 这里给出不同版本.net的解决方法。 asp.net 2.0 通常解决办法 方案一:  将.aspx文件中的page项添加Validate...

    PHP难点解析(常见问题)

    - 输入验证:对用户输入进行过滤和验证,防止SQL注入和XSS攻击。 - 使用预处理语句防止SQL注入,使用htmlspecialchars防止XSS。 - 保持系统和PHP版本更新,及时修补安全漏洞。 7. **文件操作**: 文件上传时需...

    Nginx中防止SQL注入攻击的相关配置介绍

    防止sql注入最好的办法是对于提交后台的所有数据都进行过滤转义。 对于简单的情况,比如包含单引号’ , 分号;, &lt;, &gt;, 等字符可通过rewrite直接重订向到404页面来避免。 用rewrite有个前提需要知道,一般用rewrite...

    学习jsp碰到各种问题收集的处理办法

    8. **安全性**:在JSP开发中,要关注SQL注入、跨站脚本攻击(XSS)等安全问题。学习如何使用预编译语句防止SQL注入,以及如何对用户输入进行验证和过滤,是保障应用安全的重要步骤。 9. **性能优化**:减少JSP中的...

    javaWeb安全验证漏洞修复总结

    除了上述问题,还有其他安全问题需要注意,比如XSS(跨站脚本攻击)、命令注入、文件包含漏洞等。对于XSS,应始终对用户输入进行编码;命令注入则要求使用参数化的系统调用或者限制用户输入;文件包含漏洞可通过限制...

    道网络安全面试题目共93道

    3. 验证码:虽然不是最有效的解决办法,但在某些场景下可以提高攻击者的成本。 4. Referer识别:检查HTTP头部中的Referer字段,确认请求来源的合法性。 ### 知识点四:文件上传漏洞及其防范 **定义:** 文件上传...

    Visual Studio 2005(C#)项目调试问题解决方案集锦

    需要注意的是,将validateRequest设为false会降低安全性,因为这允许不受限制的输入,可能导致XSS攻击。 2、“在没有任何数据时进行无效的读取尝试” 当SQLDataReader返回无数据记录时,未进行数据存在性判断就尝试...

Global site tag (gtag.js) - Google Analytics