.Net Core 項目中添加統一的XSS攻擊防護過濾器

1、前言

最近公司內部在對系統的安全進行培訓,恰好目前手裏的一個.net core 項目中須要增長預防xss的攻擊,本文將大概介紹下何爲XSS攻擊以及在項目中如何統一的預防XSS攻擊.html


2、XSS簡介

XSS 攻擊全稱爲跨站腳本攻擊( Cross-site Scripting ),XSS 是一種常見的 web 安全漏洞,它容許攻擊者將惡意代碼植入到提供給其餘用戶使用的頁面中。XSS 必定是由用戶的輸入引發的,不管是提交表單、仍是點擊連接(參數)的方式,只要是輸出的時候不作任何轉義和過濾,就有可能出錯。前端

—— 維基百科web

XSS 一般分爲反射型 XSS 、存儲型 XSS 和 DOM based XSS,本文介紹的反射型 XSS ,主要作法是將 Javascript 代碼加入 URL 地址的請求參數裏,若 Web 應用程序存在漏洞,請求參數會在頁面直接輸出,用戶點擊相似的惡意連接就可能遭受攻擊。攻擊的整個流程以下圖:後端

2.1 反射型XSS

反射型XSS,顧名思義在於「反射」這個一來一回的過程。反射型XSS的觸發有後端的參與,而之因此觸發XSS是由於後端解析用戶在前端輸入的帶有XSS性質的腳本或者腳本的data URI編碼,後端解析用戶輸入處理後返回給前端,由瀏覽器解析這段XSS腳本,觸發XSS漏洞。所以若是要避免反射性XSS,則必須須要後端的協調,在後端解析前端的數據時首先作相關的字串檢測和轉義處理;同時前端一樣也許針對用戶的數據作excape轉義,保證數據源的可靠性。
反射瀏覽器

2.2 存儲型XSS

存儲型則是直接將xss語句插入到網站的正常頁面中(一般都是留言板),而後用戶只要訪問了這些頁面,就會自動執行其中的xss語句。安全

存儲


3、實現

經過全局定義一個屬性過濾器實行的xss

3.1 首先新建一個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;
        }
    }

3.2 新建一個過濾器

/// <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;
        }
    }

3.3 使用XSSFilterAttribute

在須要進行XSS過濾的控制器或者action上加上對應的屬性便可ide

//屬性過濾器
    [XSSFilt]
    public class CommonApiController : Controller
    {
        

    }

四 、提示

HtmlFilter 方法本身能夠寫定義一些規則網站

五 、備註

有什麼更好的處理方式歡迎你們留言交流編碼

相關文章
相關標籤/搜索