与这个question相关的是,我在我的ASP.NET MVC项目中处理了XSS问题,并且我对MvcHtmlSTring.ToHtmlString()方法感到困惑。从documentation“返回一个表示当前对象的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">encoded <的输出--这是我怀疑的行为!
<SCRIPT/XSS SRC="htpp://ha.ckers.org/css.js">我错过了什么吗?
发布于 2012-03-21 17:57:39
MvcHtmlString (或HtmlString,或任何实现IHtmlString的东西)是用于应该以HTML逐字形式发出的字符串-也就是说,通过将其设置为MvcHtmlString,您告诉它您实际上需要那些HTML标记。
不同之处在于当您使用<%: .. %> ( ASP.NET 4或更高版本中的新功能)将字符串发送到ASP.NET页面时。在这种情况下,ASP.NET引擎将自动为您HtmlEncode常规字符串(或任何未实现IHtmlString的字符串),而MvcHtmlString将逐字/未编码地发送到页面中。
也就是说,我认为文档是错误的。在HtmlString构造函数文档中有一个具有等效错误的connect ticket,他们确实修复了该错误。(我想我已经提交了:-/也许我的被关闭了,因为我的是别人的复制品?)我也没有注意到MvcHtmlString文档是错误的。
发布于 2012-03-23 01:21:52
MSDN文档是正确的,但可能有点混乱。MvcHtmlString和IHtmlString接口用于表示已经经过HTML编码的字符串。MSDN说:
返回表示当前对象的HTML编码的字符串。
您传递给MvcHtmlString对象的对象已经是超文本标记语言编码的,所以.ToString()和.ToHtmlString()只返回您传递的对象。
请注意,MSDN文档明确规定:
ToHtmlString和ToString方法返回相同的值。
那么为什么会有这一切呢?有两个原因:
IHtmlString的对象被写出为原始数据。视图引擎假设创建IHtmlString的人已经清理了数据。IHtmlString有它自己的stringify方法,所以它不需要和ToString()有相同的实现。虽然ToHtmlString()必须返回超文本标记语言,但是您可以很容易地想象ToString()可能会返回一些开发人员友好的调试information.https://stackoverflow.com/questions/9802144
复制相似问题