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