使用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 {
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提交,在回调函数中判断一下就可以了。

原文地址:https://www.cnblogs.com/yaotome/p/8279103.html

时间: 2024-08-29 12:16:15

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

Global.asax的Application_BeginRequest实现url重写无后缀的代码

本文为大家详细介绍下利用Global.asax的Application_BeginRequest 实现url重写其无后缀,具体核心代码如下,有需求的朋友可以参考下,希望对大家有所帮助 利用Global.asax的Application_BeginRequest 实现url 重写 无后缀 代码如下: <%@ Application Language="C#" %> <script RunAt="server"> void Application

ASP.NET MVC中的Global.asax文件

1.global.asax文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 .NET Framework 类,该类是从HttpApplication基类派生的. 因此在global.asax中的代码可以访问HttpApplication类中所有的public或者protected的成员global.asax不被用户直接请求,但global.asax中的代码会被自动执行来

MVC中 global.asax

MVC框架下 global.asax 页面的事件 这些事件被触发的 顺序是: Application_BeginRequest Application_AuthenticateRequest Application_AuthorizeRequest Application_ResolveRequestCache Application_AcquireRequestState Application_PreRequestHandlerExecute Application_PreSendReque

通过Global.asax文件里面的Session_End事件记录用户退出 (or session timeout)

Session.Abandon()和timeout会触发Global.asax的Session_End事件.可以通过这个事件来记录用户退出或者session timeout,这样每个用户都会有一条登陆和退出记录. 退出登陆调用方法: public void PerformLogout() { HttpContext.Current.Session["PerformLogout"] = true; HttpContext.Current.Session.Abandon(); } Sess

Global.asax 事件备忘

Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看一下如何在应用程序开发工作中使用这个文件. 概述 Global.asax 位于应用程序根目录下.虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目中,但是它实际上是一个可选文件.删除它不会出问题——当然是在你没有使用它的情况下..asax 文件扩展名指出它是

nopCommerce 3.9 大波浪系列 之 global.asax

一.nop的global.asax文件 nop3.9基于ASP.NET MVC 5框架开发,而ASP.NET MVC中global.asax文件包含全局应用程序事件的事件处理程序,它响应应用程序级别和会话级别事件的代码. nop应用启动时调用 Application_Start 客户端请求时依次调用 Application_BeginRequest,Application_AuthenticateRequest,Application_EndRequest 请求未处理异常时调用 Applicat

ASP.NET Global.asax详解

http://blog.csdn.net/xiarenwang/article/details/7633160 文档来源:http://club.topsage.com/thread-485397-1-1.html global.asax是一个文本文件,它提供全局可用代码.这些代码包括应用程序的事件处理程序以及会话事件.方法和静态变量.有时该文件也被称为应用程序文件. global.asax 文件中的任何代码都是它所在的应用程序的一部分.每个应用程序在其根目录下只能有一个global.asax文

一起学习MVC(2)Global.asax的学习

在Global.asax.cs文件中? ? ? ? protected void Application_BeginRequest(Object sender, EventArgs e)? {? ?? Application["StartTime"] = System.DateTime.Now;? }? ? ? ? 再在webform1中的page_load事件中添加? private void Page_Load(object sender, System.EventArgs e)?

c# .net Global.asax文件的作用

1 Global.asax文件的作用 先看看MSDN的解释,Global.asax 文件(也称为 ASP.NET 应用程序文件)是一个可选的文件,该文件包含响应 ASP.NET 或HTTP模块所引发的应用程序级别和会话级别事件的代码.Global.asax 文件驻留在 ASP.NET 应用程序的根目录中.运行时,分析 Global.asax 并将其编译到一个动态生成的 .NET Framework 类,该类是从HttpApplication基类派生的.配置 ASP.NET,以便自动拒绝对 Glo