我需要在MVC Razor中编码属性值吗?

时间:2015-07-10 19:59:21

标签: asp.net-mvc-5 html-encode

在cshtml文件中,我正在为属性分配字符串。例如:

<input name="somename" value="@Model.Value">

由于@ Model.Value字符串可以包含任何Unicode字符,显然必须对字符串进行编码。 Razor会自动编码这个值吗?我猜它不会或不会因为我可以很容易地在它之后放一个@ Html.Raw将整个东西分解成两个标签。

我认为我需要做的是:

<input name="somename" value="@Html.Raw(Html.AttributeEncode(Model.Value))">

这是对的吗?

同样,如果我在脚本中的JavaScript字符串中嵌入字符串值,我应该使用:

//I could use Ajax instead of HttpUtility here, but Ajax just wraps the same call.
<script>$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))');</script>

2 个答案:

答案 0 :(得分:8)

默认情况下,Razor会对字符串执行HTML编码。根据您的字符串注入HTML流的位置,这可能是也可能不是正确的编码。如果它不是正确的编码,那么您需要自己执行正确的编码并确保返回MvcHtmlString(即IHtmlString)以确保Razor单独保留自定义编码。

由于Razor使用HTML编码,这在技术上与HTML属性编码不同(它是一个子集),因此使用@ Html.Raw(Html.AttributeEncode(Model.Value))并没有错HTML属性对值进行编码。同时,它也没有必要,因为默认的HTML编码使用相同的基本格式,并且最终将编码一个不需要在HTML属性值中编码的几个字符。

另一方面,在将字符串注入JavaScript字符串的引号的最后一种情况下,HTML编码绝对不正确,因此您肯定需要像我一样自己执行编码:@ Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))。

答案 1 :(得分:0)

Razor自动编码,所以你不需要。

具体来说,它是使用HttpUtility Encode / Decode方法编码的,这种情况发生在任何不是IHtmlString的东西上,例如MvcHtmlString。

再次编码将是多余的。如果需要转义此行为,则需要使用Html.Raw帮助程序,如果用户输入要渲染的模型值,则可能存在安全风险。