使用HtmlDecode而不使用"脚本"在asp.net核心中标记

时间:2017-04-17 12:13:50

标签: asp.net-mvc asp.net-core

我使用asp.net核心并希望通过razor语法显示html字符串。

我试过了:

@{
    string content = Model.Content.Replace("<script>", "&lt;script&gt;")
                                  .Replace("</script>", "&lt;/script&gt;");
}
@Html.Raw(System.Net.WebUtility.HtmlDecode(content))

输入:

<b>foo</b><script>alert('bar')</script>

但仍调用脚本标记中的alert函数。如何避免它(只有脚本标签)?

2 个答案:

答案 0 :(得分:0)

您可以使用convert.ToString函数将html.raw数据转换为string格式

像这样

@Convert.ToString(@Html.Raw(System.Net.WebUtility.HtmlDecode(content)))

这样就不会调用警报功能。

答案 1 :(得分:0)

您需要在解码后执行替换。就目前而言,您只是解码HTML实体替换,然后再次将它们作为普通标记。

@{
    var content = Model.Content.Replace("<script>", "&lt;script&gt;")
                               .Replace("</script>", "&lt;/script&gt;");
}
@Html.Raw(content)

虽然它值得,但我认为你实际上根本不需要解码。它并没有真正做任何事情。换句话说,这在功能上是等价的:

Html.Raw

如果脚本标记已经编码,那么当您通过window.confirm转储它们时,它们将保持这种状态。