2017年6月23日 星期五

[研究] Microsoft Anti-XSS Library V4.3 (Anti-Cross Site Scripting Library) 與 AntiXssEncoder.HtmlEncode

[研究] Microsoft Anti-XSS Library V4.3 (Microsoft Anti-Cross Site Scripting Library V4.3) 與 AntiXssEncoder.HtmlEncode

2019-07-03更新
2017-08-11更新
2017-06-23 更新
2016-11-17

Microsoft Anti-XSS Library V4.3 (Microsoft Anti-Cross Site Scripting Library V4.3)
https://www.microsoft.com/en-us/download/details.aspx?id=43126

NuGet - AntiXss
https://www.nuget.org/packages/AntiXss/

****************************************

.NET Framework 4.6 and 4.5 .NET Framework 類別庫  System.Web 命名空間
System.Web.Security.AntiXss 命名空間
https://msdn.microsoft.com/zh-tw/library/system.web.security.antixss.aspx

****************************************

ASP.NET 4.5改良
已內建Anti-Cross Site Scripting Library,AntiXssEncoder.HtmlEncode,或用懶人法<%#: Eval(“PropName”) %>
http://blog.darkthread.net/post-2012-04-25-vs11-and-aspnet-45-beta-seminar.aspx

****************************************

AntiXSS 成為內建功能

AntiXSS 這個強大的 XSS 攻擊保護函式庫,在 ASP.NET 上一直屬於外掛的功能,但到了 ASP.NET 4.5,它變成了內建的功能,ASP.NET 4.5 內建的是 AntiXSS 4.0,命名空間是 System.Web.Security.AntiXSS,內含了 AntiXSSEncoder 類別,但是它預設並不會啟用,必須要開發人員在 Web.config 中加入這一段:


<httpRuntime ...
  encoderType="System.Web.Security.AntiXss.AntiXssEncoder,
                          System.Web,
                         Version=4.0.0.0,
                         Culture=neutral,
                         PublicKeyToken=b03f5f7f11d50a3a" />


而像是 HtmlEncode, HtmlFormUrlEncode, XmlEncode, UrlEncode, UrlPathEncode, CssEncode 等也都成為了內建功能,為防護 XSS 攻擊做了更完善的保護。
https://dotblogs.com.tw/regionbbs/2012/03/01/asp_net_4_5_new_feature_in_core_services

例如:
string result = HttpUtility.HtmlEncoder(orgionMessage);    
改成
using  System.Web.Security.AntiXss;

string result = AntiXssEncoder.HtmlEncode(orgionMessage, true);    

****************************************

AntiXss 功能被內建至 .NET Framework 4.5 :
http://msdn.microsoft.com/zh-tw/library/system.web.security.antixss.aspx
如果要啟用,請參考
http://msdn.microsoft.com/zh-tw/library/system.web.security.antixss.antixssencoder.aspx
下方說明。

****************************************

Html Editor vs HtmlEncode/Sanitizer.GetSafeHtmlFragment
https://social.msdn.microsoft.com/Forums/zh-TW/2abfcce7-a8fe-4c4f-ba2d-2ed275685bdc/html-editor-vs-htmlencodesanitizergetsafehtmlfragment?forum=236

****************************************
Why not Anti-XSS Library is built in .NET Framework ?
https://social.msdn.microsoft.com/Forums/en-US/44ed592f-dc64-43c1-9211-6877b8b32a50/why-not-antixss-library-is-built-in-net-framework-?forum=netfxbcl

****************************************
目標輸出為網頁HTML時請用AntiXssEncoder.HtmlEncode
網址輸出才使用UrlEncode
Encoder應於於輸出時才使用,非擷取之後

AntiXssEncoder.HtmlEncode Method
https://docs.microsoft.com/zh-tw/dotnet/api/system.web.security.antixss.antixssencoder.htmlencode
它使用白名單,所以除非是允許的字元,其他都被編碼,
因為大於,小於 不在白名單,所以被編碼了,所以 HTML tag 全部失效

所以必較合適用於不該出現 HTML 內容的欄位做 XSS 過濾檢查,例如單行的 HTML Input 或 ASP.NET TextBox,如果您的內容一定是 HTML 呈現,可以考慮再寫一個函數,把您認為可靠的 HTML tag 加回

public static string AntiXssHtmlDecode(string inputString2)
   {
        string inputString = inputString2;
        inputString = inputString.Replace("&gt;", ">");

        inputString = inputString.Replace("&lt;/", "</");
        inputString = inputString.Replace("&quot;", "\"");
        inputString = inputString.Replace("&#39;", "'");
        inputString = inputString.Replace("&amp;", "&");
        inputString = inputString.Replace("&nbsp;", " ");

        inputString = inputString.Replace("&lt;a", "<A");
        inputString = inputString.Replace("&lt;A", "<A");
        inputString = inputString.Replace("&lt;b", "<b");
        inputString = inputString.Replace("&lt;B", "<B");
        inputString = inputString.Replace("&lt;c", "<c");
        inputString = inputString.Replace("&lt;C", "<C");
        inputString = inputString.Replace("&lt;d", "<d");
        inputString = inputString.Replace("&lt;D", "<D");
        inputString = inputString.Replace("&lt;h", "<H");
        inputString = inputString.Replace("&lt;H", "<H");
        inputString = inputString.Replace("&lt;i", "<i");
        inputString = inputString.Replace("&lt;I", "<I");
        inputString = inputString.Replace("&lt;sp", "<sp");
        inputString = inputString.Replace("&lt;SP", "<SP");
        inputString = inputString.Replace("&lt;st", "<st");
        inputString = inputString.Replace("&lt;ST", "<ST");
        inputString = inputString.Replace("&lt;t", "<t");
        inputString = inputString.Replace("&lt;T", "<T");
        inputString = inputString.Replace("&lt;u", "<u");
        inputString = inputString.Replace("&lt;U", "<U");
        inputString = inputString.Replace("&lt;p", "<P");
        inputString = inputString.Replace("&lt;P", "<P");
        ....  (略)
        return inputString;
    }

(待續)


相關

[研究] Microsoft Anti-XSS Library V4.3 (Anti-Cross Site Scripting Library)
https://shaurong.blogspot.com/2017/06/microsoft-anti-xss-library-v43-anti.html

[研究][ASP.NET] 用了 AntiXssEncoder.HtmlEncoder 仍被 Fortify SCA v17.20 說有問題
https://shaurong.blogspot.com/2018/04/aspnet-antixssencoderhtmlencoder.html

[研究] [ASP.NET] DropDownList1 的 Cross-site scripting (XSS) (Reflected XSS) 修正
https://shaurong.blogspot.com/2017/09/aspnet-dropdownlist1-cross-site.html

[研究] [ASP.NET] Cross-Site Scripting(XSS) 防範,白名單輸入驗證
https://shaurong.blogspot.com/2019/06/aspnet-cross-site-scriptingxss.html

[研究] X-XSS Protection
https://shaurong.blogspot.com/2017/06/x-xss-protection.html

沒有留言:

張貼留言