2012-03-21 101 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