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