MVC 6 中的 @Json.Encode 或 @Json.Decode 方法在哪里?

Posted

技术标签:

【中文标题】MVC 6 中的 @Json.Encode 或 @Json.Decode 方法在哪里?【英文标题】:Where are @Json.Encode or @Json.Decode methods in MVC 6? 【发布时间】:2015-05-18 11:25:07 【问题描述】:

MVC6 中的 MVC5 的 @Json.Encode 方法等价于什么?在 MVC5 中,我们可以在视图中访问这些方法。但我找不到任何可以从 MVC 6 视图访问的方法。

如果 MVC6 中已经有内置功能,我不想编写辅助方法。

【问题讨论】:

【参考方案1】:

经过一番搜索,找到了:

@inject IJsonHelper Json;
@Json.Serialize(...)

【讨论】:

应特别注意避免通过此通道传递未经处理的用户数据,因为它可能导致 XSS 漏洞 我不知道这是否已经改变,但是使用 ASP.Net Core 2.1,我不需要注入 Json。它已经在那里了【参考方案2】:

我在以下方面取得了成功:

@html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(myObj) as String)

我不确定 Json.Encode 是否已经加入,因为它是 System.Web 的一部分,现在已经不存在了。

【讨论】:

请注意,这不会在启动期间选择使用 AddJsonOptions() 指定的任何默认选项,但是注入 IJsonHelper 会。【参考方案3】:

@Json.Encode() 的功能之一是对 JSON 字符串中的实体进行自动 HTML 编码,这有助于避免 XSS 漏洞。 JsonHelper 类现在基于 Json.NET 序列化,如果配置正确,它确实支持至少部分(或全部)相同的功能。如果对不受信任的数据进行序列化,此处的其他解决方案可能容易受到 XSS 攻击。

漏洞的简单示例:

<script>
    window.something = @Json.Serialize(new  someprop = "Hello</script><script>alert('xss')</script><script>" );
</script>

将呈现为

<script>
    window.something = "someprop":"Hello
</script>
<script>alert('xss')</script>
<script>";</script>

要正确配置 Json.NET 以转义 HTML 实体,需要使用 @Json.Serialize(object, serializerSettings) 重载并将 StringEscapeHandling 覆盖为 EscapeHTML。这些设置可以在辅助类中定义或注入。

@using Newtonsoft.Json
<script>
    @
        var settings = new JsonSerializerSettings StringEscapeHandling = StringEscapeHandling.EscapeHtml;
    
    window.something = @Json.Serialize(new  someprop = "Hello</script><script>alert('xss')</script><script>" , settings);
</script>

它被呈现为:

<script>
    window.something = "someprop":"Hello\u003c/script\u003e\u003cscript\u003ealert(\u0027xss\u0027)\u003c/script\u003e\u003cscript\u003e";
</script>

其他一些在 ASP.NET Core 中安全地将数据序列化到页面的方法可以在这里找到:https://github.com/aspnet/Docs/blob/master/aspnetcore/security/cross-site-scripting.md

【讨论】:

以上是关于MVC 6 中的 @Json.Encode 或 @Json.Decode 方法在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 Html.Raw(Json.Encode(Model))?

使用实体框架6的mvc4中的单个或多个DbContext文件

json_encode 函数:特殊字符

JSON.ENCODE 将带有空格的变量拆分为多个变量

PHP json_encode json_decode UTF-8

将检索到的json转换为flutter中的自定义对象列表