Asp.net mvc 5 我需要在MVC Razor中编码属性值吗?

Asp.net mvc 5 我需要在MVC Razor中编码属性值吗?,asp.net-mvc-5,html-encode,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(H

在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>
//我可以在这里使用Ajax而不是HttpUtility,但是Ajax只是包装了相同的调用。
$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value));

Razor会自动对其进行编码,因此您无需这样做

具体地说,它是使用HttpUtility编码/解码方法进行编码的,这会发生在任何不是字符串的东西上,例如MvcHtmlString


再次编码它将是多余的。如果需要逃避此行为,则需要使用Html.Raw帮助程序,如果用户输入要呈现的模型值,则可能会带来安全风险。

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))。

调用@HTML.Raw(HTML.AttributeEncode(Model.Value))不是多余的,因为Razor仅在其类型为string时才对最终值进行编码。由于我正在对它进行编码并返回一个MvcHtmlString,Razor将不再尝试对它进行编码。HTML属性编码只编码HTML编码所做的字符的子集,但由于编码使用相同的格式(例如“&name;”、“&#nnnn;”),并且可以对不需要编码的字符进行编码,因此HTML编码剃刀对HTML和HTML属性值都足够了。因此,在本例中只使用@Model.Value是安全的。我也很清楚编码的必要性,以避免HTML注入等安全风险。我只是指出,除非Razor足够聪明,能够知道字符串嵌入的上下文,否则它不可能为HTML属性值和HTML内容选择不同的编码。事实并非如此,因为属性编码是HTML编码的一个子集,所以不管Razor字符串在哪里结束,都可以使用HTML编码。请参阅:我还应该提到,在@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))的情况下,这是绝对必要的,因为Html编码是错误的,实际上可能会导致安全风险。在这种情况下,您必须完全控制编码,并确保在注入HTML流的精确位置注入的内容格式正确。