【Global.asax--安全篇】使用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创建网站时默认存储类的文件夹
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text.RegularExpressions; /// <summary> ///XSSFilter 的摘要说明 /// </summary> public class XSSFilter { public XSSFilter() { } private 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)"; public static bool PostData() { bool result = false; try { for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++) { result = CheckData(HttpContext.Current.Request.Form[i].ToString()); if (result) { break; } } } catch (HttpRequestValidationException ex) { return true; } return result; } public static bool GetData() { bool result = false; try { for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++) { result = CheckData(HttpContext.Current.Request.QueryString[i].ToString()); if (result) { break; } } } catch (HttpRequestValidationException ex) { return true; } return result; } public static bool CookieData() { bool result = false; try { for (int i = 0; i < HttpContext.Current.Request.Cookies.Count; i++) { result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower()); if (result) { break; } } } catch (HttpRequestValidationException ex) { return true; } return result; } public static bool referer() { bool result = false; return result = CheckData(HttpContext.Current.Request.UrlReferrer.ToString()); } public static bool CheckData(string inputData) { if (Regex.IsMatch(inputData, StrRegex)) { return true; } else { return false; } } }
然后在Global.asax的Application_BeginRequest事件中添加如下代码:
void Application_BeginRequest(object sender, EventArgs e) { if (Request.Cookies != null) { if (XSSFilter.CookieData()) { Response.Write("您提交的Cookie数据有恶意字符!"); Response.End(); } } if (Request.UrlReferrer != null) { if (XSSFilter.referer()) { Response.Write("您提交的Referrer数据有恶意字符!"); Response.End(); } } if (Request.RequestType.ToUpper() == "POST") { if (XSSFilter.PostData()) { Response.Write("您提交的Post数据有恶意字符!"); Response.End(); } } if (Request.RequestType.ToUpper() == "GET") { if (XSSFilter.GetData()) { Response.Write("您提交的Get数据有恶意字符!"); Response.End(); } } }
测试一下,在提交表单时或者手动修改URL输入一行脚本<script>alert('test');</script>,就会跳转到错误提示页面。
如果用的是异步ajax提交,在回调函数中判断一下就可以了。
[转]https://www.cnblogs.com/yaotome/p/8279103.html
浙公网安备 33010602011771号