2012-03-21 100 views
7

與此相關question我在我的ASP.NET MVC項目中使用XSS問題,並且與MvcHtmlSTring.ToHtmlString()方法混淆。從documentation「返回一個HTML編碼的字符串,表示當前對象。」,但它doesn't在我的情況下工作:MvcHtmlString.ToHtmlString()不對HTML進行編碼?

var mvcHtmlString = MvcHtmlString.Create("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">").ToHtmlString(); 

    var encoded = HttpUtility.HtmlEncode("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"); 

mvcHtmlString

<SCRIPT/XSS SRC="htpp://ha.ckers.org/css.js"> 

的編碼<輸出的輸出 - - 這是我懷疑的行爲!

&lt;SCRIPT/XSS SRC=&quot;htpp://ha.ckers.org/css.js&quot;&gt; 

我錯過了什麼嗎?

回答

8

MvcHtmlString(或HtmlString,或任何實現IHtmlString)是應該發出的HTML逐字字符串 - 即通過使,你告訴它的MvcHtmlString是你真正想要的HTML標籤。

不同之處在於當您使用<%: .. %>(ASP.NET 4或更高版本中的新增功能)將字符串發送到ASP.NET頁面時。在這種情況下,ASP.NET引擎會自動爲您(或任何不實現IHtmlString的)自動生成HtmlEncode常規字符串,而MvcHtmlString將逐字/未編碼地發送到頁面中。

即我認爲文檔是錯誤的。有一個connect ticket與HtmlString構造函數文檔中的等效錯誤,他們確實修復。 (我以爲我提出了: - /也許我被關閉作爲其他人的副本?)我沒有注意到MvcHtmlString文檔也是錯誤的。

+0

如果這只是一個文檔問題,ToHtmlString方法的目的是什麼?在我的例子中:調用「ToHtmlString()」方法和「ToString()」方法沒有區別 - 兩者都會輸出錯誤的未編碼HTML。 – 2012-03-21 10:23:45

+0

這是[IHtmlString](http://msdn.microsoft.com/en-us/library/system.web.ihtmlstring.aspx)接口上的方法。它確實意味着「返回要插入到頁面中的HTML內容」 - 即,這是ASP.NET MVC 4將調用併發送結果而無需進一步編碼。我想這是因爲你可以在其他課上做一些不同的事情,但你說的沒錯。 – Rup 2012-03-21 10:32:56

8

MSDN文檔是正確的,但也許有點混淆。 MvcHtmlStringIHtmlString接口用於表示已經對進行了HTML編碼的字符串。 MSDN說:

返回一個表示當前對象的HTML編碼的字符串。

您傳遞到MvcHtmlString對象的對象已經HTML編碼,這樣既.ToString().ToHtmlString()只返回您傳遞的對象

請注意MSDN文檔也明確指出:

ToHtmlString和ToString方法返回相同的值。

那麼,爲什麼這一切呢?有兩個原因:

  1. 在Razor視圖引擎和ASP.NET Web窗體v4的實現IHtmlString對象寫出爲原始數據。視圖引擎假定創建IHtmlString的人已經清理了數據。
  2. IHtmlString有它自己的stringify方法,因此它不需要與ToString()具有相同的實現。雖然ToHtmlString()必須返回HTML,但您可以很容易想象ToString()可能會返回一些適合開發人員的調試信息。
+0

IMO它是「返回一個HTML內容的字符串」:它不一定是一個HTML編碼的字符串,它提到的編碼在這裏誤導了OP。我認爲這裏有改進的空間 - 特別是「相同值」的評論(只對MvcHtmlString文檔而不是HtmlString)應該說明這是用於構建未轉換對象的值。 – Rup 2012-03-22 17:42:28