﻿# 推薦使用 Microsoft Anti-Cross Site Scripting Library v3.1

雖然我之前已經寫過一篇【 [推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0](/post/2009/07/28/Recommand-Microsoft-Anti-Cross-Site-Scripting-Library-V30) 】文章，而且這次 [Anti-XSS Library v3.1](https://www.nuget.org/packages/AntiXSS/) 也只有小幅新增功能，但這次新增的兩個方法(**Methods**)卻是我盼望許久的功能，終於被我給等到了。我覺得任何開發 ASP.NET Web 應用程式的人都應該注意並使用這一套強大的 Anti-XSS Library，絕對有助於提升你現有 Web 應用程式的安全性。

本次改版新增的 Methods 分別是：

1.  AntiXss.GetSafeHtml 方法：將傳入的 HTML 視為一整個頁面進行過濾。
2.  AntiXss.GetSafeHtmlFragment 方法：將傳入的 HTML 視為一個 HTML 片段進行過濾。

![Anti\_XSS Library Help](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/28e5d28f8c3338f6a2df-image.png "Anti_XSS Library Help")

這兩個新增的方法 (Methods) 都是用來將傳入的**字串/文字**轉換成「**安全的 HTML 語法**」，並且支援 **串流** (**Stream**) 處理，所以當要處理大量 HTML 字串時也非常有效率，且被轉換過的 HTML 語法也會被 **正規化** (**Normalize**) 處理，讓非標準的 HTML 變成標準的 HTML 語法/格式。

所謂「**安全的 HTML 語法**」是指當傳入的 HTML 包含任何被判定為危險的(malicious)內容就會自動被刪除，用以保證最後得到的 HTML 語法是絕對安全的 HTML 版本，讓你日後就算程式寫在爛也不受 XSS 攻擊的威脅，其中包括惡意的 HTML 標籤 (例如: script, iframe, link,meta, …)、惡意的 HTML 屬性 (例如: onload, onclick, …)、惡意的 CSS 屬性 (各位知道在 CSS 中可以插入 JavaScript 執行嗎? 如下範例: )

```
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
```

能在CSS 執行 JavaScript 是很多人不知道的開發技巧，但這同時也是駭客最愛玩的 XSS 遊戲，不過這語法在新版的瀏覽器中都被移除了，目前已知支援這語法的瀏覽器有 **萬惡的 IE6.0**、**IE7.0**、**Firefox 2.0**、**Opera 9.02** 等，有認識朋友還在用 IE6/7 的人趕快請他們升級吧。

我寫了一支簡單的驗證程式，想探探 Anti-XSS Library v3.1 過濾惡意 HTML 的能力，我沒寫得很複雜，單純只是想看看轉換出來的結果如何。

程式碼如下：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e8d31be2c9d9134a2407-image.png)

轉換出來的結果是：

```
<div style="color:red; background:#FFF">OK </div>
```

當我試圖將 CSS 的 background 換成 url 的格式

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5a21d522b523589bf1de-image.png)

轉換出來的結果是：

```
<div style="color:red">OK </div>
```

我也更進一步測試了 [XSS (Cross Site Scripting) Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html) 所列的所有 XSS 攻擊情境，也確認 Anti-XSS Library 幾乎可以防禦所有的 XSS 手法 (除了一些非常非常舊的瀏覽器的XSS弱點之外)，Anti-XSS Library 過濾 HTML 的精準度無庸置疑的好、執行速度也恨快，不管怎樣都比你自己過濾 HTML 還來的安全，這畢竟是發展好多年、經過無數次驗證過的 Anti-XSS Library 版本，而且這還是完全開放原始碼的專案，有興趣研究、驗證 Anti-XSS Library 的人可以到[這裡下載](https://www.nuget.org/packages/AntiXSS/)最新版原始碼。

上段提到的一些非常非常舊的瀏覽器的XSS弱點講的是在 Netscape 4.0 中的一種非常特殊、詭異的 JavaScript 寫法竟然也能運作，如下範例：

```
<BR SIZE="&{alert('XSS')}">
```

說實在的，沒認真研究過 XSS 的人不會想到 XSS 有多少花招可以玩，你光看 [XSS (Cross Site Scripting) Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html) 所列的所有 XSS 攻擊情境就非常有趣了，很多你想都沒想到的攻擊手法，還有 [Ultimate XSS CSS injection](http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/) 也是很有創意的攻擊手法。

一般人在接受網頁表單送出 HTML 時，如果要限制特定標籤才能寫入到資料庫時，或許會使用類似【[清除字串中的HTML標籤利用RegExp進階版](https://web.archive.org/web/20090722153406/http://demo.tc:80/view.aspx?id=536)】的作法，但這樣的限制並不完整，還是非常容易被 XSS 攻擊，只要透過 HTML Attribute Injection 或 CSS Injection 就能攻擊成功，所以建議的作法是：

1.  先用 **Anti-XSS Library v3.1** 支援的 AntiXss.GetSafeHtml 或 AntiXss.GetSafeHtmlFragment 方法過濾一遍所有輸入的 HTML 字串。
2.  然後再過濾不想支援的 HTML 標籤，這個時候再使用【[清除字串中的HTML標籤利用RegExp進階版](https://web.archive.org/web/20090722153406/http://demo.tc:80/view.aspx?id=536)】作法就非常完美了。

今天一整個下午都在研究 **Anti-XSS Library v3.1**，我發現裡面有個 [HtmlToHtml Class](http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.textconverters.htmltohtml.aspx) 主要負責過濾 HTML 工作，而且寫的非常有彈性，當中有個 **委派** (delegate) 屬性 [HtmlTagCallback](http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.textconverters.htmltohtml.htmltagcallback.aspx) 可以用來自訂過濾特定標籤的程式邏輯，透過這種方式實做過濾標籤的功能也會比用 [Regex](http://msdn.microsoft.com/zh-tw/library/system.text.regularexpressions.regex.aspx) 實做來的好，只可惜在 **Anti-XSS Library v3.1** 中將 [HtmlToHtml](http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.textconverters.htmltohtml.aspx) 類別標注為 [internal](http://msdn.microsoft.com/zh-tw/library/7c5ka91b.aspx) 所以沒辦法直接使用。由於 **Anti-XSS Library v3.1** 是開放原始碼(MS-PL)，如果有需要的人還是可以將這些類別移到自己的專案中使用。

**相關連結**

-   [Microsoft Anti-Cross Site Scripting Library V3.1 下載](https://www.nuget.org/packages/AntiXSS/)
-   [AntiXSS – CodePlex](https://www.nuget.org/packages/AntiXSS/) \[ [Source Code](https://www.nuget.org/packages/AntiXSS/) \] \[ [Discussions](https://web.archive.org/web/20100503090943/http://antixss.codeplex.com:80/Thread/List.aspx) \]
-   [New and Improved AntiXss 3.1, Now With Sanitization](https://web.archive.org/web/20091017222158/http://blogs.msdn.com:80/sdl/archive/2009/09/23/new-and-improved-antixss-3-1-now-with-sanitization.aspx)
-   [HTML Sanitization in Anti-XSS Library](http://blogs.msdn.com/securitytools/archive/2009/09/01/html-sanitization-in-anti-xss-library.aspx)
-   [The Microsoft Information Security Tools (IST) team](http://blogs.msdn.com/securitytools/)
-   [Anti-XSS 3.0 Released | Jossie | Channel 9](http://channel9.msdn.com/posts/Jossie/Anti-XSS-30-Released/)
-   [XSS (Cross Site Scripting) Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html)
-   [Ultimate XSS CSS injection](http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/)
