1. 程式人生 > >使用Global.asax的Application_BeginRequest事件過濾客戶端XSS惡意腳本提交

使用Global.asax的Application_BeginRequest事件過濾客戶端XSS惡意腳本提交

false 手動 gen 觸發 drop nio static lob 程序

  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提交,在回調函數中判斷一下就可以了。

使用Global.asax的Application_BeginRequest事件過濾客戶端XSS惡意腳本提交