一、原理
跨站脚本Cross-Site Scripting(XSS)是最为流行的Web安全漏洞之一。
跨站脚本,就是攻击者可以将恶意的脚本代码注入到用户浏览的其它网页上。
XSS攻击主要分类为两种:
1、站内攻击,攻击者将攻击脚本提交到网站数据库内(如攻击者的个人信息内含攻击脚本),再欺骗其它人(系统管理员)浏览该页,触发该面的攻击脚本。
2、站外攻击,攻击都自制Email或网页,再欺骗其它人浏览该页,触发该面的攻击脚本。
二、跨站脚本介绍
有如下代码:
1 <asp:TextBox ID="txbUserName" runat="server"></asp:TextBox>
2 <asp:Button ID="btnSave" runat="server" Text="Button" onclick="btnSave_Click" />
1 protected void btnSave_Click(object sender, EventArgs e)
2 {
3 Response.Write(txbUserName.Text);
4 }
当我们在输入框里输入<script type="text/javascript">alert("script injection "+document.cookie);</script>时就会弹出用户的cookie。
而把这段代码存入数据库或自制一个网面,让其他用户触发,就可以取得其他用户的相关资源。(cookie是可以用来review页面原,可以用被攻击者的身份登陆到网页上。相关方法网上很多,大家感兴趣可以去百度一下。)
攻击者可以写JS将这些资源发到指定的网址或邮箱,用于下一步攻击。
攻南者也可以写JS抓取当前用户的页面内容,如帐户信息等等。
且JS还可以用ActinveObject来做很多事,如下载病毒和木马球、甚至是修改注册表(在客户机没有防火墙的情况下)。总之让用户输入了代码,再让这段代码可执行是非常危险的。
关于这些东西的的具体代码,有兴趣的可以一起学习,写起来不难。
三、防御方法
1、页面或web.config中配置 ValidateRequest=”false”,ValidateRequest只是ASP.NET提供的深层防御手段(Defense-in-Depth)。Web开发中不能仅依赖它,而没有专门的对输入的校验代码。
2、用正则表达式过滤或转换特殊字符。(不推荐,容易出问题)
3、使用ASP.NET自身支持的HttpUtility。(这个比较方便)
例如:
Response.Write(HttpUtility.HtmlEncode(Request.Form["name"]));
4、使用微软提供的反跨站脚本库(Microsoft Anti-Cross Site Scripting Library V1.5 - AntiXss)。(这是最安全的)
AntiXSS是一个单独下载的软件库。开发人员可以从http://www.microsoft.com/download/en/details.aspx?id=5242直接下载。(安装后在项目里引用AntiXSSLibrary.dll用可以调用了。注意这个是.net4.0的版本,请根据自己需求下载相应版本。)
AntiXss的使用方式与HttpUtility类似:
String Name = AntiXss.HtmlEncode(Request.QueryString["Name"]);
那么HttpUtility和AntiXss的区别是什么?开发人员应该使用哪一种?
它们最大的区别在于HttpUtility.HtmlEncode采用的是黑名单验证(Black list)方式。即HttpUtility.HtmlEncode仅仅过滤它知道的特殊字符,而允许其它的输入。AntiXss.HtmlEncode采用的白名单验证(White list)方式。它只允许输出它认为合法的字符,而过滤掉其它的所有字符。
两者中,AntiXss.HtmlEncode要更为安全,是推荐的使用手段。