最近公司內部在對系統的安全進行培訓,恰好目前手裏的一個.net core 項目中須要增長預防xss的攻擊,本文將大概介紹下何爲XSS攻擊以及在項目中如何統一的預防XSS攻擊.html
XSS 攻擊全稱爲跨站腳本攻擊( Cross-site Scripting ),XSS 是一種常見的 web 安全漏洞,它容許攻擊者將惡意代碼植入到提供給其餘用戶使用的頁面中。XSS 必定是由用戶的輸入引發的,不管是提交表單、仍是點擊連接(參數)的方式,只要是輸出的時候不作任何轉義和過濾,就有可能出錯。前端
—— 維基百科web
XSS 一般分爲反射型 XSS 、存儲型 XSS 和 DOM based XSS,本文介紹的反射型 XSS ,主要作法是將 Javascript 代碼加入 URL 地址的請求參數裏,若 Web 應用程序存在漏洞,請求參數會在頁面直接輸出,用戶點擊相似的惡意連接就可能遭受攻擊。攻擊的整個流程以下圖:後端
反射型XSS,顧名思義在於「反射」這個一來一回的過程。反射型XSS的觸發有後端的參與,而之因此觸發XSS是由於後端解析用戶在前端輸入的帶有XSS性質的腳本或者腳本的data URI編碼,後端解析用戶輸入處理後返回給前端,由瀏覽器解析這段XSS腳本,觸發XSS漏洞。所以若是要避免反射性XSS,則必須須要後端的協調,在後端解析前端的數據時首先作相關的字串檢測和轉義處理;同時前端一樣也許針對用戶的數據作excape轉義,保證數據源的可靠性。
瀏覽器
存儲型則是直接將xss語句插入到網站的正常頁面中(一般都是留言板),而後用戶只要訪問了這些頁面,就會自動執行其中的xss語句。安全
經過全局定義一個屬性過濾器實行的xss
public static class XSSHelper { /// <summary> /// XSS過濾 /// </summary> /// <param name="html">html代碼</param> /// <returns>過濾結果</returns> public static string XssFilter(string html) { string str = HtmlFilter(html); return str; } /// <summary> /// 過濾HTML標記 /// </summary> /// <param name="Htmlstring"></param> /// <returns></returns> public static string HtmlFilter(string Htmlstring) { // 寫本身的處理邏輯便可,下面給出一個比較暴力的孤哦旅,把 匹配到<[^>]*>所有過濾掉,建議慎用,只是一個例子 string result = Regex.Replace(Htmlstring, @"<[^>]*>", String.Empty); return result; } }
/// <summary> /// XSS 過濾器 /// </summary> public class XSSFilterAttribute : ActionFilterAttribute { /// <summary> /// OnActionExecuting /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { //獲取參數集合 var ps = context.ActionDescriptor.Parameters; //遍歷參數集合 foreach (var p in ps) { if (context.ActionArguments[p.Name] != null) { //當參數是str if (p.ParameterType.Equals(typeof(string))) { context.ActionArguments[p.Name] = XSSHelper.XssFilter(context.ActionArguments[p.Name].ToString()); } else if (p.ParameterType.IsClass)//當參數是一個實體 { PostModelFieldFilter(p.ParameterType, context.ActionArguments[p.Name]); } } } } /// <summary> /// 遍歷實體的字符串屬性 /// </summary> /// <param name="type">數據類型</param> /// <param name="obj">對象</param> /// <returns></returns> private object PostModelFieldFilter( Type type, object obj) { if (obj != null) { foreach (var item in type.GetProperties()) { if (item.GetValue(obj) != null) { //當參數是str if (item.PropertyType.Equals(typeof(string))) { string value = item.GetValue(obj).ToString(); item.SetValue(obj, XSSHelper.XssFilter(value)); } else if (item.PropertyType.IsClass)//當參數是一個實體 { item.SetValue(obj, PostModelFieldFilter(item.PropertyType, item.GetValue(obj))); } } } } return obj; } }
在須要進行XSS過濾的控制器或者action上加上對應的屬性便可ide
//屬性過濾器 [XSSFilt] public class CommonApiController : Controller { }
HtmlFilter
方法本身能夠寫定義一些規則。網站
有什麼更好的處理方式歡迎你們留言交流編碼