Microsoft AntiXSS Library 3.1 Upgrade 4.0

如果你的網站有讓人家「輸入資料」,那必須非常小心的處理,在以前,我們必須寫很多檢查程式,前面javascript檢查一遍,後面再用VBScript(ASP)或Visual Basic(ASP.NET)再檢查一遍,反正這種檢查永遠不嫌多。

一般而言,為了要保護好網站,所以這種檢測、檢查的程式就可以寫很多很多,在ASP.NET最簡單的方式就是拉Validator控制項,如果更進一步就寫些JavaScript來加強,但一山還有一山高,總是有人有得出辦法去過去,不然SQL Injection、XSS…都已經出現多少年,還是有一堆網站被它們打敗,你可以看看「XSS (Cross Site Scripting) Cheat Sheet」或「Ultimate XSS CSS injection」這裡面的功擊情境,Try it,你寫的檢測Code能防的了幾種,我是看的頭都花了。

再來,寫JavaScript有個壞處,就是你的處理方式,只要懂的人就能把你的JavaScript內容看光光,知道了你的處理方式,我們就能開始設計跳過你處理方式的方法。ASP.NET的Validator控制項是不錯,但Validator控制項只合適用來檢測一些簡單的需求,如果複雜些的,那Validator控制項還是不好用,不相信,簡單,一樣使用Validator控制項去檢測上面那些攻擊情境的內容看看。

那Regular Expression呢?不多說,這是張王牌,但使能用它的人,必須有很好的內功,不然你是練不了它的。

後來發現了一個非常好用的函式庫「Microsoft Web Protection Library」,我是從AntiXSS Library 3.1版開始使用,此函式庫不得了,AntiXSS Library會幫你進行內容過濾的動作,將有害的內容剔除與替代,給你一個受保護的環境。在AntiXSS Library 3.1就能保護我上面所提「XSS (Cross Site Scripting) Cheat Sheet」與「Ultimate XSS CSS injection」的所有攻擊情境,這讓我們用起來安心,用起來爽歪歪。

我不敢保證,AntiXSS Library能100%保護我們不受功擊或不讓功擊成功,但最少基礎上的保護,別人如果是70分,你使用AntiXSS Library後,我們會加到90分以上,所以我極推薦AntiXSS Library。想像是幫「網站」裝防毒軟體,有裝有保佑。

Microsoft AntiXSS Library 3.1 Upgrade 4.0

在更新AntiXSS Library 3.1 DLL檔至4.0版之後,發現一些內容上的差異,在Visual Studio 2010中,會提供原先使用AntiXSS Class過時的訊息,查了一下4.0的手冊,還直的沒有AntiXSS的內容,取代的是Sanitzer Class(Sanitzer,清潔劑,取的真好),用法與AntiXSS一樣,Sanitzer.GetSafeHtml()、Sanitzer.GetSafeHtmlFragment()。

加入Microsoft AntiXSS Library 4.0參考

在專案或網站的「Bin」目錄下,按右鍵選擇「加入參考」,選擇「瀏覽」,找到安裝Microsoft AntiXSS Library的目錄,一般是在「...\Microsoft Information Security\AntiXSS Library v4.0」之下(你可同時安裝3.1與4.0),你可以找到兩個DLL檔,AntiXSSLibrary.dll與HtmlSanitizationLibrary.dll,如果你有使用AntiXSS Library 3.1,要與舊版程式碼相容,那就參考新的AntiXSSLibrary.dll;如果你是要使用AntiXSS Library 4.0功能,那就參考HtmlSanitizationLibrary.dll,參考完在使用前先「Imports Microsoft.Security.Application」(Visual Base)、「Using Microsoft.Security.Application」(C#)即可使用。

Sanitzer Class

Dim s1 As String = Sanitizer.GetSafeHtml(tbxNamen.Text)
Dim s2 As String = Sanitizer.GetSafeHtmlFragment(tbxName.Text)

' Encoder Class也是AntiXSS Library所提供
Response.Write(Encoder.HtmlEncode(s1))
Response.Write(Encoder.HtmlEncode(s2))

我們輸入含Tag(<b> KKBruce </b>)的內容,我們看一下結果:
<!-- s1的內容 -->
<html>

<body>

<b>KKBruce</b>

</body>

</html>


<!-- s2的內容 -->
<b>KKBruce</b>

我們輸入含Script Tag(<script> alert('Hello world!');</script>),我們看一下結果:
<!-- s1的內容 -->
<html>

<head>

</head>

</html>



<!-- s2的內容,空空如也,什麼都沒有,已經被過濾剔除 -->


Sanitizer.GetSafeHtml()會傳回一個完整的HTML架構內容,而Sanitizer.GetSafeHtmlFragment()是就傳回你所傳入的內容。注意第二個含Script例子,它被AntiXSS Library 4.0認定為有害內容,所以就回傳一個「String.Empty」給你,這點與AntiXSS Library 3.1不同,如果你是使用AntiXSS Library 3.1 upgrade AntiXSS Library 4.0,這部份有所不同,請參考AntiXSS Library 4.0手冊。

你可以繼續Try其他SQL Injection、XSS…等,你應該會得到很滿意的結果。

結論是,愛它(網站)就要保護它,請多多利用這個免費Microsoft Web Protection Library(AntiXSS Library),有了AntiXSS Library你就不怕中標了。

2 則留言:

  1. 您好,看到這篇不知道能否請問您個人的習慣,是習慣在存入資料庫前就Encode,還是存原文字入資料庫,取出時在做 Encode 呢?想參考一下意見ˊˋ,謝謝您。

    回覆刪除
    回覆
    1. 找篇前輩的文章給你參考:http://www.allenkuo.com/EBook5/view.aspx?a=1&TreeNodeID=124&id=1171

      刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。