使用Global.asax的Application_BeginRequest事件過濾用戶端XSS惡意指令碼提交

來源:互聯網
上載者:User

標籤:date   err   response   linq   update   else   修改   web   like   

  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 XSSFilter11 {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         try19         {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         try40         {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         try61         {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         else92         {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惡意指令碼提交

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.