VS2010與.NET4系列 19.ASP.NET4中新的HTML編碼的語法

今天介紹ASP.NET 4引入的新的語法特性——即在代碼塊中自動產生HTML編碼輸出的能力。這可以幫助保護應用程序和站點免受跨站點腳本(XSS)注入和HTML注入攻擊,並使你能夠使用簡潔的語法來做到這一點。

HTML編碼

跨站點腳本注入(XSS)和HTML編碼攻擊是兩個最常見的折磨網站和應用程序的安全性問題。當黑客發現了一個可以把客戶端腳本或HTML標記注入到頁面的方法,隨後其他訪問者查看此頁面時就會發生此類問題。這可能會被用於破壞網站,還可以讓黑客能夠運行客戶端腳本代碼盜取cookie數據並利用用戶的身份在網站上做壞事。

一種避免跨站點腳本攻擊的方法是確保呈現的輸出在頁面中都是 HTML 編碼的。這就確保了任何被終端用戶輸入/修改的內容在輸出回頁面時都不會包含像<script>或<img>元素的標籤。

過去如何對內容進行HTML編碼

ASP.NET 應用程序(尤其是使用ASP.NET MVC)經常依賴於使用<%= %>代碼塊表達式來呈現輸出。開發人員經常要在表達式中使用 Server.HtmlEncode() 或 HttpUtility.Encode() 輔助方法來對輸出內容在呈現前進行 HTML 編碼。例如像下面的代碼:

image

儘管這樣工作良好,但有兩個不好的地方:

  1. 有些囉嗦
  2. 開發人員經常忘記調用 Server.HtmlEncode() 方法,還沒有容易的檢驗它是否使用的方法

新的 <%: %>代碼塊語法

使用ASP.NET 4引入的新的代碼表達式語法(<%: %>),可以呈現像 <%= %> 塊的輸出,但在輸出前自動進行了 HTML 編碼。這樣就消除了像上面那樣需要顯式進行HTML編碼內容的步驟。現在只要編寫下面這樣更簡潔的代碼來完成相同的任務了:

image

避免雙重編碼

儘管 HTML 編碼內容是一個良好的最佳實踐,但有時候輸出的內容可能已經被編碼過了——這時你不想再對其再次進行編碼。

ASP.NET 4 引入了新的 IHtmlString 接口(和具體實現:HtmlString),它讓你能夠實現一種類型來表示它的值已經被恰當地編碼了(或已經檢查過了),可以作爲 HTML 顯示了,因此值不應當再次被 HTML 編碼。<%: %>代碼塊語法會檢測到 IHtmlString 的存在,如果值實現了這個接口就不會對代碼表達式的輸出進行 HTML 編碼。這就避免了讓開發人員選擇使用 <%= %> 還是 <%: %>代碼塊。你可以始終使用 <%: %>代碼塊,並使用任何實現 IHtmlString 接口已經對值進行HTML編碼的任何屬性或數據類型。

對 <%: %> 使用 ASP.NET MVC 的 HTML 輔助方法

考慮下在ASP.NET MVC中使用 HTML 輔助方法的場景。這些輔助方法通常會返回 HTML。例如:Html.TextBox() 輔助方法返回像 <input type="text"/> 的標記。使用 ASP.NET MVC 2 這些輔助方法默認都返回 HtmlString 類型,這表示返回的字符串內容對呈現是安全的不應當再被 <%: %>塊編碼了。

可以在 <%= %> 代碼塊中使用這些方法:

image

也可以在 <%: %> 代碼塊中使用:

image

上面兩種情況中,從輔助方法返回的內容都將作爲 HTML 呈現到客戶端,<%: %>代碼塊會避免雙重編碼。

支架支撐ASP.NET MVC2 視圖

使用VS2010(或VWD2010 Express)構建 ASP.NET MVC 2 應用程序時,你會發現使用"Add Viw" 對話框支撐的視圖現存默認都是使用 <%: %>塊來輸出任何內容了。例如,下面我們爲 Article 對象搭建(scaffold)了一個簡單的“編輯”視圖。注意對標籤、文本框和驗證消息使用的 <%: %>代碼塊:

image

總結

新的 <%: %> 語法提供了自動化HTML 編碼內容隨後作爲輸出呈現的的簡潔方法。它允許你讓你的代碼不那麼囉嗦,讓你的站點使用進行了 HTML 編碼內容。這可以幫助保護你的應用程序防止跨站點注入(XSS)和HMTL注入攻擊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章