zoukankan      html  css  js  c++  java
  • 使用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(|(alert|confirm|prompt)|^+/v(8|9)|<[^>]*?=[^>]*?&#[^>]*?>|(and|or).{1,6}?(=|>|<|in|like)|/*.+?*/|<s*script|<s*img|EXEC|UNION.+?SELECT|UPDATE.+?SET|INSERTs+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提交,在回调函数中判断一下就可以了。

  • 相关阅读:
    稳扎稳打Silverlight(47) 4.0UI之操作剪切板, 隐式样式, CompositeTransform, 拖放外部文件到程序中
    返璞归真 asp.net mvc (9) asp.net mvc 3.0 新特性之 View(Razor)
    返璞归真 asp.net mvc (6) asp.net mvc 2.0 新特性
    稳扎稳打Silverlight(48) 4.0其它之打印, 动态绑定, 增强的导航系统, 杂七杂八
    精进不休 .NET 4.0 (9) ADO.NET Entity Framework 4.1 之 Code First
    稳扎稳打Silverlight(42) 4.0控件之Viewbox, RichTextBox
    稳扎稳打Silverlight(53) 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和BrowserHttp
    稳扎稳打 Silverlight 4.0 系列文章索引
    稳扎稳打Silverlight(54) 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
    返璞归真 asp.net mvc (8) asp.net mvc 3.0 新特性之 Model
  • 原文地址:https://www.cnblogs.com/yaotome/p/8279103.html
Copyright © 2011-2022 走看看