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文件