.net core xss攻擊防禦

来源:https://www.cnblogs.com/87Super/archive/2018/07/11/9294850.html
-Advertisement-
Play Games

XSS攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的電腦安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。 比如我們在表單提交的時候插入腳本代碼 如果不進行 ...


 

XSS攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的電腦安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。

比如我們在表單提交的時候插入腳本代碼

如果不進行處理,那麼就是這種效果,我這裡只是演示一個簡單的彈窗

下麵給大家分享一下我的解決方案。

需要用到這個庫:HtmlSanitizer

https://github.com/mganss/HtmlSanitizer

新建一個過濾類。

    public class  XSS
    {
        private HtmlSanitizer sanitizer;
        public XSS()
        {
            sanitizer = new HtmlSanitizer();
            //sanitizer.AllowedTags.Add("div");//標簽白名單
            sanitizer.AllowedAttributes.Add("class");//標簽屬性白名單,預設沒有class標簽屬性           
            //sanitizer.AllowedCssProperties.Add("font-family");//CSS屬性白名單
        }

        /// <summary>
        /// XSS過濾
        /// </summary>
        /// <param name="html">html代碼</param>
        /// <returns>過濾結果</returns>
        public string Filter(string html)
        {
            string str = sanitizer.Sanitize(html);
            return str;
        }
    }

新建一個過濾器

    public class FieldFilterAttribute : Attribute,IActionFilter
    {
        private XSS xss;
        public FieldFilterAttribute()
        {
            xss = new XSS();
        }

        //在Action方法之回之後調用
        public void OnActionExecuted(ActionExecutedContext context)
        {

        }

        //在調用Action方法之前調用
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //獲取Action參數集合
            var ps = context.ActionDescriptor.Parameters;
            //遍歷參數集合
            foreach (var p in ps)
            {
                if (context.ActionArguments[p.Name] != null)
                {
                    //當參數等於字元串
                    if (p.ParameterType.Equals(typeof(string)))
                    {
                        context.ActionArguments[p.Name] = xss.Filter(context.ActionArguments[p.Name].ToString());
                    }
                    else if (p.ParameterType.IsClass)//當參數等於類
                    {
                        ModelFieldFilter(p.Name, p.ParameterType, context.ActionArguments[p.Name]);
                    }
                }                   

            }
        }

        /// <summary>
        /// 遍歷修改類的字元串屬性
        /// </summary>
        /// <param name="key">類名</param>
        /// <param name="t">數據類型</param>
        /// <param name="obj">對象</param>
        /// <returns></returns>
        private object ModelFieldFilter(string key, Type t, object obj)
        {
            //獲取類的屬性集合
            //var ats = t.GetCustomAttributes(typeof(FieldFilterAttribute), false);


            if (obj != null)
            {
                //獲取類的屬性集合
                var pps = t.GetProperties();

                foreach (var pp in pps)
                {
                    if(pp.GetValue(obj) != null)
                    {
                        //當屬性等於字元串
                        if (pp.PropertyType.Equals(typeof(string)))
                        {
                            string value = pp.GetValue(obj).ToString();
                            pp.SetValue(obj, xss.Filter(value));
                        }
                        else if (pp.PropertyType.IsClass)//當屬性等於類進行遞歸
                        {
                            pp.SetValue(obj, ModelFieldFilter(pp.Name, pp.PropertyType, pp.GetValue(obj)));
                        }
                    }
                    
                }
            }

            return obj;
        }
    }
    //屬性過濾器
    [FieldFilter]
    public class NoteBookController : ManageController
    {
        //筆記操作介面
        private INoteBookAppService _noteBookApp;
        public NoteBookController(INoteBookAppService noteBookApp)
        {
            this._noteBookApp = noteBookApp;
        }
        public IActionResult Tab()
        {
            return View();
        }

    }

 

然後在需要過濾的控制器加上過濾控制器特性就可以了。這樣所有string類型的參數就都會進行過濾了。如果不需要對整個控制器進行過濾,只需要在相應的Action加上特性。

最後 點個贊吧。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 上一篇博客中我們可以得知通過Swagger插件可以很方便的提供給介面開發者線上調試,但是實際上Swagger附帶的功能還有很多, 比如使用NSwag生成客戶端調用代碼,進一步解放介面開發者。 NSwag NSwag是一個發佈在GitHub上的開源項目,它可以根據Swagger說明頁上的swag ...
  •  Asp.Net Core Web Api圖片上傳及MongoDB存儲實例教程(一) 圖片或者文件上傳相信大家在開發中應該都會用到吧,有的時候還要對圖片生成縮略圖。那麼如何在Asp.Net Core Web Api實現圖片上傳存儲以及生成縮略圖呢?今天我就使用MongoDB作為圖片存儲,然後使用S ...
  • 吃飯/訓覺-工作室尊重並保護所有使用其應用的用戶的個人隱私權。為了給您提供更準確、更有個性化的服務,吃飯/訓覺-工作室會按照本隱私權政策的規定使用和披露您的個人信息。但吃飯/訓覺-工作室將以高度的勤勉、審慎義務對待這些信息。除本隱私權政策另有規定外,在未徵得您事先許可的情況下,吃飯/訓覺-工作室不會 ...
  • 介紹 不管是新手還是工作幾年的老油條,對try{}catch{}來說是不陌生的。他可以來幫助我們獲取異常信息,在try中的代碼出現錯誤,火災catch代碼塊中被捕獲到。官方也給了詳細的解釋:。 拋出異常時,公共語言運行庫(CLR)會查找catch處理此異常的語句。如果當前正在執行的方法不包含這樣的c ...
  • 步驟:以VS2015為例, 第一步,右鍵解決方案後 點擊【管理解決方案的NuGet程式包(N)...】,找到【log4net】下載安裝,如下圖: 第二步:安裝完成後,在AssemblyInfo.cs代碼中 加入以下代碼: 如下圖: 第三步:新建log4net.config,內容如下: 第四步:新建公 ...
  • 在開發者界面用可以看到很多ptqrlogin開頭的 name 我要做的就是 模擬瀏覽器的操作,把它轉換成我們自己的客戶端。所以只要是瀏覽器里有的我們都要模擬。接下來判斷二維碼失效,兩秒一次吧,弄一個Timer smart 類 #region 第二講檢查二維碼狀態 private static Sys ...
  • 正則表達式平時不常用,經常都是用的時候,臨時抱佛腳,查文檔,然後就是被各種坑之後,才會逐漸熟練。 線上正則表達式測試:http://tool.oschina.net/regex/ 線上JSON格式化:https://www.bejson.com/ 正則表達式手冊:http://tool.oschin ...
  • 開發工具:Visual Studio 2017 15.7.5 開發平臺:Windows 10 新建WebApi項目,Web.config配置文件中,system.web下級節點中預設沒有customErrors的配置,即customErrors預設是RemoteOnly `` mode 必選的屬性。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...