標籤: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惡意指令碼提交