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

  • 相关阅读:
    day1-字符串拼接、表达式、break和continue
    ssh免密登录
    1-5 文档的基本 CRUD 与批量操作
    1-4 安装logstash
    1-3 安装cerebro
    1-2 kibana 7.5.1 安装配置
    1-1 elasticsearch7.5 集群搭建 es 7
    生产环境k8s集群搭建
    Gearman任务分布系统部署windows平台_使用Cygwin
    [转载]单元测试之道(使用NUnit)
  • 原文地址:https://www.cnblogs.com/yaotome/p/8279103.html
Copyright © 2020-2023  润新知