MvcHtmlString.ToHtmlString()不编码HTML?

Rob*_*sig 7 asp.net xss asp.net-mvc

与此问题相关,我在ASP.NET MVC项目中使用XSS问题,并且与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\">");
Run Code Online (Sandbox Code Playgroud)

输出mvcHtmlString

<SCRIPT/XSS SRC="htpp://ha.ckers.org/css.js">
Run Code Online (Sandbox Code Playgroud)

输出编码< - 这是我怀疑的行为!

&lt;SCRIPT/XSS SRC=&quot;htpp://ha.ckers.org/css.js&quot;&gt;
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Rup*_*Rup 10

MvcHtmlString(或HtmlString,或实现IHtmlString的任何东西)用于应该逐字发送的字符串 - 即通过将其设为MvcHtmlString,您告诉它您确实需要这些HTML标记.

不同之处在于使用<%: .. %>(ASP.NET 4或更高版本中的新增功能)将字符串发送到ASP.NET页面时.在这种情况下,ASP.NET引擎将为您自动HtmlEncode常规字符串(或任何不实现IHtmlString的字符串),而MvcHtmlString将以逐字/未编码的形式发送到页面中.

即我认为文件是错误的.在HtmlString构造函数文档中有一个带有等效错误的连接票证,他们确实修复了它.(我以为我提交了这个: - /或许我的关闭是别人的副本?)我没注意到MvcHtmlString文档也是错误的.


Eil*_*lon 9

MSDN文档是正确的,但可能有点令人困惑.该MvcHtmlStringIHtmlString接口被用于表示有一个字符串被HTML编码.MSDN说:

返回表示当前对象的HTML编码字符串.

您传递到对象MvcHtmlString对象已经HTML编码,这样既.ToString().ToHtmlString()只返回你传递的对象.

请注意,MSDN文档明确指出:

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

那么为什么要这么做呢?两个原因:

  1. 在Razor视图引擎和ASP.NET Web Forms v4中,实现的对象IHtmlString被写为原始数据.视图引擎假设创建的人IHtmlString已经清理了数据.
  2. IHtmlString有自己的stringify方法,因此它不需要具有相同的实现ToString().虽然ToHtmlString()必须返回HTML,但您可以轻松地想象ToString()可能会返回一些开发人员友好的调试信息.