使用Global.asax的Application_BeginRequest事件过滤客户端XSS恶意脚本提交

【使用Global.asax的Application_BeginRequest事件过滤客户端XSS恶意脚本提交】男儿欲遂平生志,五经勤向窗前读。这篇文章主要讲述使用Global.asax的Application_BeginRequest事件过滤客户端XSS恶意脚本提交相关的知识,希望能为你提供帮助。
XSS攻击全称跨站脚本攻击(Cross Site Scripting),是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码(如html代码和客户端脚本)植入到提供给其它用户使用的页面中。要预防XSS攻击,就必须在处理客户端请求之前判断用户的输入是否合法,如果不合法就要拦截。在ASP.NET项目的根目录下有一个全局程序文件Global.asax文件,每次IIS请求都会按顺序执行这个文件中的不同事件。其中Application_BeginRequest事件在ASP.NET开始处理每个请求时触发,在这个事件处理中的代码将在页面或者服务处理请求之前执行。我们可以在这里写代码去验证客户端请求是否合法。
首先在app_code文件夹下创建一个XSSFilter类,这是ASP.NET创建网站时默认存储类的文件夹

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Text.RegularExpressions; 6 7 /// < summary> 8 ///XSSFilter 的摘要说明 9 /// < /summary> 10 public class XSSFilter 11 { 12public XSSFilter() { } 13 14private const string StrRegex = @"< [^> ]+?style=[\w]+?:expression\(|\b(alert|confirm|prompt)\b|^\+/v(8|9)|< [^> ]*?=[^> ]*?& #[^> ]*?> |\b(and|or)\b.{1,6}?(=|> |< |\bin\b|\blike\b)|/\*.+?\*/|< \s*script\b|< \s*img\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)"; 15public static bool PostData() 16{ 17bool result = false; 18try 19{ 20for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++) 21{ 22result = CheckData(HttpContext.Current.Request.Form[i].ToString()); 23if (result) 24{ 25break; 26} 27} 28} 29catch (HttpRequestValidationException ex) 30{ 31return true; 32} 33return result; 34} 35 36public static bool GetData() 37{ 38bool result = false; 39try 40{ 41for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++) 42{ 43result = CheckData(HttpContext.Current.Request.QueryString[i].ToString()); 44if (result) 45{ 46break; 47} 48} 49} 50catch (HttpRequestValidationException ex) 51{ 52return true; 53} 54return result; 55} 56 57public static bool CookieData() 58{ 59bool result = false; 60try 61{ 62for (int i = 0; i < HttpContext.Current.Request.Cookies.Count; i++) 63{ 64result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower()); 65if (result) 66{ 67break; 68} 69} 70} 71catch (HttpRequestValidationException ex) 72{ 73return true; 74} 75return result; 76 77} 78 79public static bool referer() 80{ 81bool result = false; 82return result = CheckData(HttpContext.Current.Request.UrlReferrer.ToString()); 83} 84 85public static bool CheckData(string inputData) 86{ 87if (Regex.IsMatch(inputData, StrRegex)) 88{ 89return true; 90} 91else 92{ 93return false; 94} 95} 96 }

然后在Global.asax的Application_BeginRequest事件中添加如下代码:
1void Application_BeginRequest(object sender, EventArgs e) 2{ 3if (Request.Cookies != null) 4{ 5if (XSSFilter.CookieData()) 6{ 7Response.Write("您提交的Cookie数据有恶意字符!"); 8Response.End(); 9} 10} 11if (Request.UrlReferrer != null) 12{ 13if (XSSFilter.referer()) 14{ 15Response.Write("您提交的Referrer数据有恶意字符!"); 16Response.End(); 17} 18} 19if (Request.RequestType.ToUpper() == "POST") 20{ 21if (XSSFilter.PostData()) 22{ 23Response.Write("您提交的Post数据有恶意字符!"); 24Response.End(); 25} 26} 27if (Request.RequestType.ToUpper() == "GET") 28{ 29if (XSSFilter.GetData()) 30{ 31Response.Write("您提交的Get数据有恶意字符!"); 32Response.End(); 33} 34} 35}

测试一下,在提交表单时或者手动修改URL输入一行脚本< script> alert(‘test‘); < /script> ,就会跳转到错误提示页面。
如果用的是异步ajax提交,在回调函数中判断一下就可以了。


    推荐阅读