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 { 12 public XSSFilter() { } 13 14 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)"; 15 public static bool PostData() 16 { 17 bool result = false; 18 try 19 { 20 for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++) 21 { 22 result = CheckData(HttpContext.Current.Request.Form[i].ToString()); 23 if (result) 24 { 25 break; 26 } 27 } 28 } 29 catch (HttpRequestValidationException ex) 30 { 31 return true; 32 } 33 return result; 34 } 35 36 public static bool GetData() 37 { 38 bool result = false; 39 try 40 { 41 for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++) 42 { 43 result = CheckData(HttpContext.Current.Request.QueryString[i].ToString()); 44 if (result) 45 { 46 break; 47 } 48 } 49 } 50 catch (HttpRequestValidationException ex) 51 { 52 return true; 53 } 54 return result; 55 } 56 57 public static bool CookieData() 58 { 59 bool result = false; 60 try 61 { 62 for (int i = 0; i < HttpContext.Current.Request.Cookies.Count; i++) 63 { 64 result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower()); 65 if (result) 66 { 67 break; 68 } 69 } 70 } 71 catch (HttpRequestValidationException ex) 72 { 73 return true; 74 } 75 return result; 76 77 } 78 79 public static bool referer() 80 { 81 bool result = false; 82 return result = CheckData(HttpContext.Current.Request.UrlReferrer.ToString()); 83 } 84 85 public static bool CheckData(string inputData) 86 { 87 if (Regex.IsMatch(inputData, StrRegex)) 88 { 89 return true; 90 } 91 else 92 { 93 return false; 94 } 95 } 96 }
然后在Global.asax的Application_BeginRequest事件中添加如下代码:
1 void Application_BeginRequest(object sender, EventArgs e) 2 { 3 if (Request.Cookies != null) 4 { 5 if (XSSFilter.CookieData()) 6 { 7 Response.Write("您提交的Cookie数据有恶意字符!"); 8 Response.End(); 9 } 10 } 11 if (Request.UrlReferrer != null) 12 { 13 if (XSSFilter.referer()) 14 { 15 Response.Write("您提交的Referrer数据有恶意字符!"); 16 Response.End(); 17 } 18 } 19 if (Request.RequestType.ToUpper() == "POST") 20 { 21 if (XSSFilter.PostData()) 22 { 23 Response.Write("您提交的Post数据有恶意字符!"); 24 Response.End(); 25 } 26 } 27 if (Request.RequestType.ToUpper() == "GET") 28 { 29 if (XSSFilter.GetData()) 30 { 31 Response.Write("您提交的Get数据有恶意字符!"); 32 Response.End(); 33 } 34 } 35 }
测试一下,在提交表单时或者手动修改URL输入一行脚本<script>alert('test');</script>,就会跳转到错误提示页面。
如果用的是异步ajax提交,在回调函数中判断一下就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构