2

我正在编写一个辅助方法,它将在页面上生成评论的 HTML,并且我希望能够显示带有“< script >alert("hello");</script >”的评论作为它的内容。

使用时

@HttpUtility.HtmlDecode(comment.Content)

在 *.cshtml 文件中,该脚本将呈现为纯文本。

但是在视图中使用这个 HTML 助手时:

@Html.PendingComment(comment)

该脚本被呈现为 HTML 并被执行:

public static IHtmlString PendingComment(this HtmlHelper helper, VoidCommentPending comment)
    {
        var sb = new StringBuilder();
        sb.Append("<p>" + HttpUtility.HtmlDecode(comment.Content) + "</p>");
        return MvcHtmlString.Create(sb.ToString());
    }

尝试使用“new HtmlString()”,结果相同,当我将返回结果从 IHtmlString 更改为字符串时,甚至段落标签都呈现为纯文本。

是否可以在 HtmlHelper 中混合编码和解码 HTML 字符串,还是应该使用不同的方法?

4

1 回答 1

4

好的,所以在将评论存储到数据库之前,我使用 HttpUtility.Encode:

model.Content= HttpUtility.HtmlEncode(model.Content);

然后我刚刚从我的辅助方法中删除了解码

sb.Append("<p>" + comment.Content + "</p>");

它在我的页面上将“< script >alert("hello");</script >”显示为纯文本。问题解决了。

基本上我是“双重解码”。使用 HttpUtility.HtmlDecode 这个内容:

&lt;script&gt;alert(&quot;hello&quot;);&lt;/script&gt;

正在被解码为我想要的“纯文本”html,但随后MvcHtmlString.Create再次对其进行解码并将其呈现为 HTML。

于 2013-04-02T13:45:34.470 回答