摘要:VS 2010 和 .NET 4.0 系列之《ASP.NET 4以及ASP.NET MVC 2中對輸出進行HTML編碼的<%: %>新句法》篇
【原文位址】 New <%: %>Syntax for HTML Encoding Output in ASP.NET 4 (and ASP.NET MVC 2)
【原文發表日期】 Tuesday, April 06, 2010 11:57 PM
【除了寫部落格外,我現在還使用Twitter發短貼和共享連結。請通過twitter.com/scottgu跟隨我。】
這是我針對即將發佈的VS 2010 和 .NET 4所撰寫的 文章系列的第十九篇。
今天的文章討論ASP.NET 4中引進的一個很小,但非常有用的新句法特性,即能自動到程式碼片段中對輸出進行HTML編碼的功能。這有助於保護你的應用和網站免受跨站腳本攻擊(XSS)和HTML注入攻擊,而且允許你使用一個非常簡潔的句法來實現。
HTML編碼
跨站腳本注入(XSS)和HTML編碼攻擊是網站和應用頻受其害的2個最常見的安全問題。它們是由駭客找到方法,把客戶端腳本或HTML標識注入網頁,然後這些網頁被訪問網站的其他訪問者瀏覽時發生的。這可以用來糟蹋一個網站,以及允許駭客運行客戶端程式碼來偷竊cookie資料或者利用用戶在網站上的身份做壞事。
幫助減少跨站腳本攻擊的一個方法是確保網頁上顯示的輸出是被HTML編碼過了的,這幫助確保任何由終端用戶輸入或修改過的內容無法在向網頁輸出時含有像<script> 或 <img>這樣的元素。
今天是如何對內容進行HTML編碼的
ASP.NET 應用(特別是那些使用ASP.NET MVC的應用)經常依賴使用 <%= %> 程式碼片段運算式來顯示輸出。開發人員今天經常在這些運算式內使用Server.HtmlEncode() 或 HttpUtility.Encode()輔助方法在顯示輸出之前對輸出進行HTML編碼。這可以用像下面這樣的程式碼來實現:
雖然這正常工作,但有2個小缺點:
- 有點冗長。
- 開發人員經常忘了叫用Server.HtmlEncode方法,而且沒有簡單的方法可以對整個應用程式來確保其用法。
新的程式碼片段句法: <%: %>
在ASP.NET 4中,我們引進了一個新的程式碼運算式句法,<%: %>,像<%= %>一樣顯示輸出,但在顯示前,會對輸出自動進行HTML編碼。這免掉了象上面例子那樣顯式地對內容進行HTML編碼的需要,你只要編寫象下面這樣更為簡潔的程式碼即可實現完全一樣的事:
我們選擇 <%: %> 句法,是因為很容易快速地替換現有的 <%= %> 程式碼區段實例,它還允許你輕鬆地在你的程式庫查詢 <%= %> 元素,發現並確保任何你在應用中沒有使用HTML編碼的地方,以確保其行為之正確性。
避免雙重編碼
雖然對內容進行HTML編碼通常是個好的最佳實踐,但有時你輸出的內容就是HTML或者已經編碼過了,在這樣的情形下,你不想要再做HTML編碼。
ASP.NET 4 引進了一個新的 IHtmlString介面 (以及一個具體實作: HtmlString),你可以將其在型別上實現,來表示它的值用來顯示HTML時,已經恰當地編碼過了(或者已經檢查過了),因此它的值不該再作HTML編碼了。<%: %>程式碼片段句法會檢查內中程式碼運算式的值是否實現了IHtmlString 介面,如果實現了的話,就不再對其輸出進行HTML編碼。這允許開發人員避免需要每每做決定是用<%= %> 還是用 <%: %>程式碼片段,而你總可以使用<%: %>程式碼片段,然後讓已經HTML編碼過了的任何屬性或資料型別實現 IHtmlString介面。
在 <%: %> 中使用ASP.NET MVC HTML輔助方法
舉一個這個HTML編碼替換機制非常有用的實際例子,考慮一下你在ASP.NET MVC中使用HTML輔助方法的場景。這些輔助方法一般傳回HTML。例如,Html.TextBox()輔助方法傳回象 <input type="text" /> 這樣的標識。在ASP.NET MVC 2中,這些輔助方法現在預設傳回HtmlString型別,表明傳回的字串內容顯示是安全的,<%: %>不必再編碼了。
這允許你將這些方法在 <%= %> 程式碼塊中:
以及 <%: %> 程式碼塊中使用:
在上面兩種情形中,從輔助方法傳回的HTML內容是作為HTML在客戶端顯示的, <%: %> 會避免做雙重編碼。
這允許你在應用中預設使用 <%: %> 程式碼片段,而不是<%= %>程式碼塊。如果你要是固執(hardcore)的話,你甚至可以建立一個編譯規則,在應用中查詢 <%= %> 用例,如果發現,將其標記為出錯,來強制HTML編碼總是發生。
ASP.NET MVC 2 View 推導 (Scaffolding)
在你使用VS 2010 (或者免費的 Visual Web Developer 2010 Express版本)建造ASP.NET MVC 2應用時,你會發現使用「添加檢視」對話框生成的視圖在輸出任何內容時,現在是預設使用 <%: %> 程式碼塊的。例如,下面,我為 Article 物件生成了一個簡單的「編輯」檢視。注意其中標籤,文字框和驗證消息的三個 <%: %> 程式碼片段用例(都是使用HTML輔助方法輸出的):
結語
新的 <%: %> 句法 提供了一個簡潔的方式來自動對內容進行HTML編碼,並將其顯示為輸出。它允許你減少程式碼的冗長,可以輕鬆地檢查/確認整個網站上的內容都是HTML編碼過了的。這可以幫助你的應用免受跨站腳本注入(XSS)和HTML注入攻擊。
希望本文對你有所幫助,
Scott