ASP.Net防范XSS漏洞攻击的利器HtmlSanitizer
項目名稱:HtmlSanitizer
NuGet安裝指令:Install-Package HtmlSanitizer
官方網站:https://github.com/mganss/HtmlSanitizer?
開源協議:MIT
可靠程度:更新活躍,目前已經是3.x版,成熟靠譜。
?
1、??什么是XSS漏洞?
XSS漏洞又稱為“跨站腳本”漏洞,指的是網站對于用戶輸入的內容不加甄別的原樣又輸出到了頁面中,造成惡意代碼被執行的漏洞。
比如A用戶在發帖的時候在內容中寫入了:<script>alert("您的賬號有危險,請聯系官方客服010-4444444")</script>這個電話其實不是官方的客服電話,而是A用戶擁有的詐騙電話。如果網站把<script>alert("您的賬號有危險,請聯系官方客服010-4444444")</script>原樣輸出到網頁中,那么其他用戶打開帖子的時候就會彈出這樣一個提示框,有的小白用戶以為是官方彈出的提示,從而被騙。當然XSS漏洞的破壞方式還有其他的,比如寫重定向代碼把用戶重定向到詐騙網站、繪制詐騙的登錄表單竊取用戶賬號密碼等。
2、??如何防范XSS漏洞?
ASP.net非常貼心的幫我們做了XSS漏洞的防范,無論是ASP.Net WebForm還是ASP.Net MVC,當用戶提交的表單中含有疑似html標簽的內容的時候框架直接就會報錯“從客戶端中檢測到有潛在危險的值”,這樣程序員根本不用操心刻意去防范。
那么我們為什么還要考慮XSS漏洞防范呢?因為在有一些場合下,還是需要允許瀏覽器提交帶有html標簽的內容的。比如如鵬網的新聞評論區:
? ? ? ? ?這里允許用戶發鏈接、發圖片、設置字體顏色、畫table等復雜的格式控制,這些內容都是Html格式表達最方便。有的項目中是使用UBB、MarkDown等轉義的方案,但是都沒有允許用戶寫html最強大、靈活。現在主流的Html在線編輯器,比如UEditor、KindEditor等也都是輸出成html內容。因此必須允許我們把這些html內容提交給服務器。
3、??如何禁用ASP.Net的ValidateRequest
要“允許我們把這些html內容提交給服務器”,就要禁用“自動XSS檢測”,也就是關閉ValidateRequest。無論是ASP.Net WebForm,還是ASP.Net MVC中,都有關掉.Net的“自動XSS檢測”的方法。
由于ASP.Net MVC的必然崛起,ASP.Net WebForm業內不推薦使用了,在如鵬網的.Net培訓課程中也把ASP.Net WebForm刪掉了,因此這里就不再浪費時間介紹如何在ASP.Net WebForm禁用“自動XSS檢測”,感興趣的可以搜索一下“ASP.Net WebForm?禁用ValidateRequest”。
下面我只介紹在ASP.Net MVC中如何禁用ValidateRequest,很簡單,只要在Action方法上標注[ValidateInput(false)]即可。比如
[ValidateInput(false)]
public ActionResult Test()
{
}
4、??如何避免XSS漏洞?
一旦禁用“自動XSS檢測”,咱們的系統又陷入了危險之中。如何即允許用戶提交html,又避免用戶提交有潛在危險的html代碼呢?HtmlSanitizer給出了很好的解決方案:設置不危險的“標簽、屬性”白名單,把所有不在白名單中的“標簽、屬性”全部干掉。
?????????下面是例子代碼:
var sanitizer = new HtmlSanitizer();
var html = @"<SCRIPT>alert('xss')</script><div οnlοad=""alert('xss')"""
+ @"style=""background-color: test"">Test<img src=""test.gif"""
+ @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>";
html = sanitizer.Sanitize(html);
?????????輸出一下html你就會發現它變成了:
<div style="background-color: test">Test<img src="test.gif" style="margin: 10px"></div>
?
?????????很顯然,那些危險的<script>標簽、onload事件都被刪除掉了,甚至這種潛在的危險都能過濾掉:background-image: url(javascript:alert('xss'))
?????????而無害的標簽、樣式、屬性則被保留了下來。
5、??細節問題:
1)??form表單也會引起潛在的危險,但是HtmlSanitizer默認是允許form標簽的,因此要禁用掉,只要執行sanitizer.AllowedTags.Remove("form");把form表單從“標簽白名單”中移除即可。其他你不想允許的標簽也可以通過這種方法移除。具體有哪些白名單可以從HtmlSanitizer的官網看到。HtmlSanitizer類的AllowedAttributes、AllowedCssProperties、AllowedTags分別是“標簽屬性白名單”、“CSS屬性白名單”、“標簽白名單”。
2)??HtmlSanitizer會對html做正規化修正以保證更符合Html標準,因此并不會原樣輸出,比如4 < 5這種不規范的寫法會被處理成4 < 5,<SPAN>test</p>這種不規范的寫法會被處理成<span>test<p></p></span>
3)??HtmlSanitizer依賴于AngleSharp這個開源庫做html的解析,因此如果用的時候存在一些bug,可以嘗試升級一下AngleSharp庫;
原文地址:http://bbs.rupeng.com/Post/Index/4084
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的ASP.Net防范XSS漏洞攻击的利器HtmlSanitizer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 7 中的模范和实践
- 下一篇: 使用 Docker 让传统 .NET 应