微软反跨站脚本库3.0 RTM

跨站脚本Cross-Site Scripting(XSS)又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。
跨站脚本Cross-Site Scripting(XSS)是最为流行的Web安全漏洞之一。据统计,2007年,跨站脚本类的安全漏洞的数目已经远远超出传统类型的安全漏洞(http://en.wikipedia.org/wiki/Cross-site_scripting)

虽然在IE8中引入了客户端的XSS过滤器以减少XSS对用户造成的危害,但是XSS本质上是Web应用服务的漏洞,仅仅依赖客户端的保护措施是不够的。解决问题的根本是在Web应用程序的代码中消除XSS安全漏洞。

以下是在Web应用的开发中避免XSS安全漏洞的几个原则:

  • 检查所有产生动态网页的代码
  • 判定动态网页的内容是否包括不安全的输入信息
  • 对输入进行校验
  • 对输出进行编码以过滤特殊字符

采用不同的Web开发工具,实施以上原则的具体步骤也不相同。当需要将一个字符串输出到Web网页时,但又不能完全确定这个字符串是否包括HTML的特殊字符,例如“<,>,&”等等,可以使用编码(HTMLEncode)以过滤这些特殊字符。在ASP.NET中有两种方法:一种是使用HttpUtility,另一种就是使用微软提供的XSS库,最新版本是3.0 ,采用MS-PL协议发布的开源项目,7月14日发布了,下载地址是:http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&displaylang=en

AntiXss的使用方式与HttpUtility类似:

String Name = AntiXss.HtmlEncode(Request.QueryString["Name"]);

它们最大的区别在于HttpUtility.HtmlEncode采用的是黑名单验证(Black list)方式。即HttpUtility.HtmlEncode仅仅过滤它知道的特殊字符,而允许其它的输入。AntiXss.HtmlEncode采用的白名单验证(White list)方式。它只允许输出它认为合法的字符,而过滤掉其它的所有字符。

两者中,AntiXss.HtmlEncode要更为安全,是推荐的使用手段。

在asp.net 程序中避免 Cross-Site Scripting 攻击的正确方法:

(1) ValidateRequest = true

(2) 对于所有使用者的输入加以编码并检查长度 : Application、Session、Url QueryString、Cookie、HTTP Header、数据库、文件、Form表单(根据输出的区域,使用以下相对应的七种编码方法)

 

XSS Libray 包含如下的方法:

Encoding Method Description
HtmlEncode Encodes input strings for use in HTML
HtmlAttributeEncode Encodes input strings for use in HTML attributes
JavaScriptEncode Encodes input strings for use in JavaScript
UrlEncode Encodes input strings for use in Universal Resource Locators (URLs)
VisualBasicScriptEncode Encodes input strings for use in Visual Basic Script
XmlEncode Encodes input strings for use in XML
XmlAttributeEncode Encodes input strings for use in XML attributes

具体的使用方法及示例,请参考MSDN: Microsoft Anti-Cross Site Scripting Library V1.5: Protecting the Contoso Bookmark Page 

AntiXSS Library v3.0 除了保留了老版本的一些静态的Encode工具方法(重新实现),另外最重要的就是新增了
AntiXSS HttpModule 用于统一 Encode 输出ASP.Net Server Web Control 为encode 输出的相关属性,如:Text属性等
原理大概是《利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型》
http://www.cnblogs.com/Microshaoft/archive/2009/01/08/1371475.html

微软反跨站脚本库主页:http://msdn.microsoft.com/en-us/security/aa973814.aspx
XSS(跨站)攻击全解析: http://www4.it168.com/jtzt/shenlan/safe/xss/
CodePlex站点: http://antixss.codeplex.com/

作者: 自由、创新、研究、探索……
出处:http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
posted @ 2009-07-16 07:36 张善友 阅读(3511) 评论(13) 编辑 收藏

 回复 引用 查看   
#1楼 2009-07-16 08:11 seagreen7      
“ValidateRequest = true ” 对用户体验不好。
我一般都是直接关闭。我防止脚本攻击的办法是:
1,不过滤用户输入的任何字符,统一使用HtmlEncode编码用户输入
2,如果需要编辑输入内容的时候,在使用htmldecode解码,以还原用户原始输入。
3,在页面中显示用户输入的内容的时候直接显示,不需要再次处理了。

不知道我的做法有何漏洞或不妥之处,请楼主赐教。


 回复 引用 查看   
#2楼 2009-07-16 08:47 为爱走天涯      
输入的时候用htmlencode编码会使字符串的长度变大,有可能导致添加数据因为长度多于数据库字段设定的长度而报错
 回复 引用 查看   
#3楼 2009-07-16 08:48 dikongpulu      
@seagreen7
2,3不正引起xss问题吗 呵呵

 回复 引用 查看   
#4楼 2009-07-16 09:01 Young.Jiang      
@seagreen7
和没做一样
其次还要在代码中检测,攻击还可能来自url参数!

 回复 引用 查看   
#5楼 2009-07-16 09:17 Jeffrey Zhao      
@dikongpulu
为什么?

 回复 引用 查看   
#6楼 2009-07-16 09:40 RobertFang      
以前FB的同事,顶一下先。。。。
 回复 引用 查看   
#7楼 2009-07-16 10:54 Nick Wang (懒人王)      
引用seagreen7:
“ValidateRequest = true ” 对用户体验不好。
我一般都是直接关闭。我防止脚本攻击的办法是:
1,不过滤用户输入的任何字符,统一使用HtmlEncode编码用户输入
2,如果需要编辑输入内容的时候,在使用htmldecode解码,以还原用户原始输入。
3,在页面中显示用户输入的内容的时候直接显示,不需要再次处理了。

不知道我的做法有何漏洞或不妥之处,请楼主赐教。


对于XSS来说不应encode用户的输入,而是应encode输出到页面的不可靠数据,不可靠数据包括url输入,form输入,存储在数据库中的用户输入等。如果在用户输入的时候就encode,数据库中的数据就不是原始数据了,而是encode过的,在以数据为中心的应用中,数据是很重要的,这么做就等于降低了数据的质量。

 回复 引用 查看   
#8楼 2009-07-16 11:44 James.Ying      
@Nick Wang
页面输出的时候HtmlEncode,这样不是更不能还原用户所输入的吗?数据通过htmlEncode后完全可以还原,数据并没有被破坏,如果你觉得非常重要的话,你可以利用另外一个字段进行保存,动网在6。0的开始就已经保存2个内容,一个是原文,一个是转换后的文章

 回复 引用 查看   
#9楼 2009-07-16 12:05 Nick Wang (懒人王)      
@James.Ying
HtmlEncode并不是为了还原用户的输入,而是为了防御XSS。

这么说吧,本来用户的输入是没有问题的(应该已经经过一些其它方面的验证了),只是因为输出成为html后,可能会有可执行代码,才会有风险。如果不是输出在html中,比如text或者pdf,根本就不需要encode。因此用户的原始数据应该是不应encode的。


 回复 引用 查看   
#10楼 2009-07-16 12:21 Microshaoft      
AntiXSS Library v3.0 除了保留了老版本的一些静态的Encode工具方法(重新实现),另外最重要的就是新增了
AntiXSS HttpModule 用于统一 Encode 输出ASP.Net Server Web Control 为encode 输出的相关属性,如:Text属性等
原理大概是
《利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型》
http://www.cnblogs.com/Microshaoft/archive/2009/01/08/1371475.html

 回复 引用 查看   
#11楼 2009-07-16 15:24 代码乱了      
今天早上试用了一下,效果不错,用法也很简便
 回复 引用 查看   
#12楼 2009-09-02 14:30 邀月      
学习并受教育着