MVC 6 中的@Json.Encode 或@Json.Decode 方法在哪里?
Where are @Json.Encode or @Json.Decode methods in MVC 6?
MVC5 的 @Json.Encode
方法在 MVC6 中的等价物是什么?在 MVC5 中,我们可以在视图中访问这些方法。但是我找不到任何可以从 MVC 6 视图访问的方法。
如果 MVC6 中已有内置功能,我不想编写辅助方法。
我在以下方面取得了成功:
@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(myObj) as String)
我不确定 Json.Encode 是否已经加入,因为它是 System.Web 的一部分,现在已经消失了。
经过一番搜索,找到了:
@inject IJsonHelper Json;
@Json.Serialize(...)
@Json.Encode()
的一个特点是在 JSON 字符串中自动 HTML 编码实体,这有助于避免 XSS 漏洞。 JsonHelper
class 现在基于 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。这些设置可以在助手 class 中定义或注入。
@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
MVC5 的 @Json.Encode
方法在 MVC6 中的等价物是什么?在 MVC5 中,我们可以在视图中访问这些方法。但是我找不到任何可以从 MVC 6 视图访问的方法。
如果 MVC6 中已有内置功能,我不想编写辅助方法。
我在以下方面取得了成功:
@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(myObj) as String)
我不确定 Json.Encode 是否已经加入,因为它是 System.Web 的一部分,现在已经消失了。
经过一番搜索,找到了:
@inject IJsonHelper Json;
@Json.Serialize(...)
@Json.Encode()
的一个特点是在 JSON 字符串中自动 HTML 编码实体,这有助于避免 XSS 漏洞。 JsonHelper
class 现在基于 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。这些设置可以在助手 class 中定义或注入。
@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