雖然我之前已經寫過一篇【 推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0 】文章,而且這次 Anti-XSS Library v3.1 也只有小幅新增功能,但這次新增的兩個方法(Methods)卻是我盼望許久的功能,終於被我給等到了。我覺得任何開發 ASP.NET Web 應用程式的人都應該注意並使用這一套強大的 Anti-XSS Library,絕對有助於提升你現有 Web 應用程式的安全性。
本次改版新增的 Methods 分別是:
- AntiXss.GetSafeHtml 方法:將傳入的 HTML 視為一整個頁面進行過濾。
- AntiXss.GetSafeHtmlFragment 方法:將傳入的 HTML 視為一個 HTML 片段進行過濾。
這兩個新增的方法 (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 的能力,我沒寫得很複雜,單純只是想看看轉換出來的結果如何。
程式碼如下:
轉換出來的結果是:
<div style="color:red; background:#FFF">OK </div>
當我試圖將 CSS 的 background 換成 url 的格式
轉換出來的結果是:
<div style="color:red">OK </div>
我也更進一步測試了 XSS (Cross Site Scripting) Cheat Sheet 所列的所有 XSS 攻擊情境,也確認 Anti-XSS Library 幾乎可以防禦所有的 XSS 手法 (除了一些非常非常舊的瀏覽器的XSS弱點之外),Anti-XSS Library 過濾 HTML 的精準度無庸置疑的好、執行速度也恨快,不管怎樣都比你自己過濾 HTML 還來的安全,這畢竟是發展好多年、經過無數次驗證過的 Anti-XSS Library 版本,而且這還是完全開放原始碼的專案,有興趣研究、驗證 Anti-XSS Library 的人可以到這裡下載最新版原始碼。
上段提到的一些非常非常舊的瀏覽器的XSS弱點講的是在 Netscape 4.0 中的一種非常特殊、詭異的 JavaScript 寫法竟然也能運作,如下範例:
<BR SIZE="&{alert('XSS')}">
說實在的,沒認真研究過 XSS 的人不會想到 XSS 有多少花招可以玩,你光看 XSS (Cross Site Scripting) Cheat Sheet 所列的所有 XSS 攻擊情境就非常有趣了,很多你想都沒想到的攻擊手法,還有 Ultimate XSS CSS injection 也是很有創意的攻擊手法。
一般人在接受網頁表單送出 HTML 時,如果要限制特定標籤才能寫入到資料庫時,或許會使用類似【清除字串中的HTML標籤利用RegExp進階版】的作法,但這樣的限制並不完整,還是非常容易被 XSS 攻擊,只要透過 HTML Attribute Injection 或 CSS Injection 就能攻擊成功,所以建議的作法是:
- 先用 Anti-XSS Library v3.1 支援的 AntiXss.GetSafeHtml 或 AntiXss.GetSafeHtmlFragment 方法過濾一遍所有輸入的 HTML 字串。
- 然後再過濾不想支援的 HTML 標籤,這個時候再使用【清除字串中的HTML標籤利用RegExp進階版】作法就非常完美了。
今天一整個下午都在研究 Anti-XSS Library v3.1,我發現裡面有個 HtmlToHtml Class 主要負責過濾 HTML 工作,而且寫的非常有彈性,當中有個 委派 (delegate) 屬性 HtmlTagCallback 可以用來自訂過濾特定標籤的程式邏輯,透過這種方式實做過濾標籤的功能也會比用 Regex 實做來的好,只可惜在 Anti-XSS Library v3.1 中將 HtmlToHtml 類別標注為 internal 所以沒辦法直接使用。由於 Anti-XSS Library v3.1 是開放原始碼(MS-PL),如果有需要的人還是可以將這些類別移到自己的專案中使用。
相關連結
- Microsoft Anti-Cross Site Scripting Library V3.1 下載
- AntiXSS – CodePlex [ Source Code ] [ Discussions ]
- New and Improved AntiXss 3.1, Now With Sanitization
- HTML Sanitization in Anti-XSS Library
- The Microsoft Information Security Tools (IST) team
- Anti-XSS 3.0 Released | Jossie | Channel 9
- XSS (Cross Site Scripting) Cheat Sheet
- Ultimate XSS CSS injection