【问题标题】:Do I need to encode attribute values in MVC Razor?我需要在 MVC Razor 中编码属性值吗?
【发布时间】:2015-07-10 19:59:21
【问题描述】:

在一个 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>

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      Razor 会自动对其进行编码,所以你不需要。

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

      再次编码将是多余的。如果您需要逃避这种行为,则需要使用 Html.Raw 帮助器,如果用户输入您正在渲染的模型值,这可能会带来安全风险。

      【讨论】:

      • 调用 @Html.Raw(Html.AttributeEncode(Model.Value)) 并不是多余的,因为 Razor 仅对字符串类型的最终值进行编码。由于我正在对其进行编码并返回一个 MvcHtmlString,因此 Razor 不会尝试再次对其进行编码。 HTML 属性编码 只编码 HTML 编码 的字符子集,但由于编码使用相同的格式(例如“&name;”、“nnnn;” ) 并且可以对不需要编码的字符进行编码,Razor 所做的 HTML 编码对于 HTML 和 HTML 属性值都足够了。所以在这种情况下使用@Model.Value 是安全的。
      • 我也很清楚编码的必要性,以避免像 HTML 注入这样的安全风险。我只是指出,除非 Razor 足够聪明,可以知道嵌入字符串的上下文,否则它不可能为 HTML 属性值和 HTML 内容选择不同的编码。它没有,因为属性编码是 HTML 编码的子集,所以无论 Razor 字符串在哪里结束,都可以只对所有内容进行 HTML 编码。见:stackoverflow.com/a/13246856/88409
      • 我还应该提到,在 @Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value)) 的情况下,这是绝对必要的,因为 HTML 编码是错误的,实际上可能导致安全风险。在这种情况下,您绝对必须控制编码并确保在您注入的准确位置注入 HTML 流的内容格式正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      相关资源
      最近更新 更多