今天的文章介紹了ASP.NET 4中引入的一個小並且很是有用的新語法功能 - 這是在代碼塊中自動對輸出進行HTML編碼的功能。這有助於保護您的應用程序和站點免受跨站點腳本注入(XSS)和HTML注入攻擊,而且使您可以使用簡潔的語法來執行此操做。html
跨網站腳本注入(XSS)和HTML編碼攻擊是困擾網站和應用程序的兩個最多見的安全問題。當黑客找到一種方法將客戶端腳本或HTML標記注入網頁,而後由其餘訪問者查看網站時,就會發生這種狀況。這既能夠用來破壞網站,也可讓黑客運行客戶端腳本代碼,竊取cookie數據和/或利用用戶的身份在網站上作壞事。web
幫助緩解跨站腳本攻擊的一種方法是確保呈現的輸出是在頁面內編碼的HTML。這有助於確保任何可能由最終用戶輸入/修改的內容都不能輸出到包含<script>或<img>元素的標籤的頁面上。 windows
如何HTML編碼今天的內容安全
ASP.NET應用程序(尤爲是使用ASP.NET MVC的應用程序)一般依靠使用<%=%>代碼塊表達式來呈現輸出。今天的開發人員常常使用這些表達式中的Server.HtmlEncode()或HttpUtility.Encode()幫助器方法在呈現以前對輸出進行HTML編碼。這可使用以下代碼來完成:cookie
雖然這工做正常,但有兩個缺點:mvc
使用ASP.NET 4,咱們引入了一種新的代碼表達式語法(<%:%>),它能夠呈現像<%=%>塊這樣的輸出,可是也會在執行以前自動對HTML進行編碼。這消除了像上面的例子那樣顯式地HTML編碼內容的須要。相反,你能夠在下面寫出更簡潔的代碼來完成徹底相同的事情:asp.net
咱們選擇了<%:%>語法,以便快速替換<%=%>代碼塊的現有實例。它還使您可以輕鬆搜索代碼庫中的<%=%>元素,以查找和驗證在應用程序中沒有使用HTML編碼的任何狀況,以確保您具備正確的行爲。網站
雖然HTML編碼內容一般是一個很好的實踐,可是有時您輸出的內容是HTML或已經被編碼 - 在這種狀況下,您不想再對HTML進行編碼。 編碼
ASP.NET 4引入了一個新的IHtmlString接口 (以及一個具體的實現:HtmlString),您能夠在類型上實現以代表其值已經正確編碼(或以其餘方式)顯示爲HTML,所以值不該該再次進行HTML編碼。<%:%>代碼塊語法檢查IHtmlString接口是否存在,若是代碼表達式的值實現了此接口,則不會對代碼表達式的輸出進行HTML編碼。這容許開發人員避免必須根據每一個案例來決定是使用<%=%>仍是<%:%>代碼塊。相反,您始終可使用<%:%>代碼塊, 接口。spa
使用帶有<%:%>的ASP.NET MVC HTML Helper方法
有關此HTML編碼轉義機制有用的實際示例,請考慮在ASP.NET MVC中使用HTML幫助程序方法的狀況。這些輔助方法一般返回HTML。例如:Html.TextBox()輔助方法返回標記,如<input type =「text」/>。在ASP.NET MVC 2中,這些輔助方法如今默認返回HtmlString類型 - 這表示返回的字符串內容對於渲染是安全的,不該該由<%:%>塊編碼。
這使您能夠在<%=%>代碼塊塊中使用這些方法:
以及在<%:%>代碼塊塊中:
在這兩種狀況下,從helper方法返回的HTML內容都將以HTML的形式呈現給客戶端,而且<%:%>代碼塊將避免對其進行雙重編碼。
這使您能夠默認在應用程序中始終使用<%:%>代碼塊代替<%=%>代碼塊。若是你想要真正的核心,你甚至能夠建立一個構建規則,搜索你的應用程序尋找<%=%>的用法,並標記任何它發現的錯誤,以強制HTML編碼老是發生。
當您使用VS 2010(或免費的Visual Web Developer 2010 Express)來構建ASP.NET MVC 2應用程序時,您會發現默認狀況下使用「添加視圖」對話框的腳手架視圖始終使用<%:% >輸出任何內容時阻止。例如,下面我爲一個Article對象搭建了一個簡單的「編輯」視圖。請注意標籤,文本框和驗證消息的<%:%>代碼塊的三種用法(全部使用HTML幫助程序方法的輸出):
新的<%:%>語法提供了一種自動HTML編碼內容的簡明方法,而後將其做爲輸出呈現。它可讓你的代碼不那麼冗長,而且能夠輕鬆地檢查/驗證你的網站是否始終是HTML編碼內容。這能夠幫助保護您的應用程序免受跨站點腳本注入(XSS)和HTML注入攻擊。