如何使用Razor将未编码的Json写入视图?


153

我试图使用Razor将对象作为JSON写入我的Asp.Net MVC视图,如下所示:

<script type="text/javascript">
  var potentialAttendees = @Json.Encode(Model.PotentialAttendees);
</script>

问题是在输出中对JSON进行了编码,而我的浏览器不喜欢它。例如:

<script type="text/javascript">
    var potentialAttendees = [{&quot;Name&quot;:&quot;Samuel Jack&quot;},];
</script>

如何使Razor发出未编码的JSON?

Answers:


190

你做:

@Html.Raw(Json.Encode(Model.PotentialAttendees))

在Beta 2之前的版本中,您这样做是:

@(new HtmlString(Json.Encode(Model.PotentialAttendees)))

3
如果我要在对象属性中添加一些编码的文本怎么办?\,{\“ UrlPart \”:\“ TjcolklFX5c \”,\“ Title \”:\“ Mama Isn \ u},{\”例如。这会因为js认为'正在转义var a =''的本机字符串缩放对“”同样适用。anny idea?
SomeRandomName 2015年

@SomeRandomName您可以使用javascriptserializer类似的方式 @Html.Raw(javascriptSerializerObjecct.Serialize(myObject))
vikscool

我们在2017年使用MVC 5,这个答案仍然很完美!
加百利·埃斯皮诺萨

这个答案是唯一完美的答案。谢谢!
Jean-Paul

43

Newtonsoft的JsonConvert.SerializeObject行为与Json.Encode@ david-k-egghead建议的行为不同,并且可以使您容易受到XSS攻击

将此代码放到Razor视图中,可以看到使用Json.Encode是安全的,并且可以在JavaScript上下文中使Newtonsoft变得安全,但这并非没有额外的工作。

<script>
    var jsonEncodePotentialAttendees = @Html.Raw(Json.Encode(
        new[] { new { Name = "Samuel Jack</script><script>alert('jsonEncodePotentialAttendees failed XSS test')</script>" } }
    ));
    alert('jsonEncodePotentialAttendees passed XSS test: ' + jsonEncodePotentialAttendees[0].Name);
</script>
<script>
    var safeNewtonsoftPotentialAttendees = JSON.parse(@Html.Raw(HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(
        new[] { new { Name = "Samuel Jack</script><script>alert('safeNewtonsoftPotentialAttendees failed XSS test')</script>" } }), addDoubleQuotes: true)));
    alert('safeNewtonsoftPotentialAttendees passed XSS test: ' + safeNewtonsoftPotentialAttendees[0].Name);
</script>
<script>
    var unsafeNewtonsoftPotentialAttendees = @Html.Raw(JsonConvert.SerializeObject(
        new[] { new { Name = "Samuel Jack</script><script>alert('unsafeNewtonsoftPotentialAttendees failed XSS test')</script>" } }));
    alert('unsafeNewtonsoftPotentialAttendees passed XSS test: ' + unsafeNewtonsoftPotentialAttendees[0].Name);
</script>

也可以看看:


当他们添加Json.Encode时,您有任何想法吗?我不知道实际上有一种在页面上插入json的安全方法,而且我知道我过去对此进行了大量研究。
克里斯·马里西奇

1
Json.Encode据我所知,它存在的时间很长,但是缺点是它使用Microsoft的实现输出非标准日期(并且可能会做其他麻烦的事情)。我使用并鼓励JsonConvert.SerializeObject结合适当的转义使用Newtonsoft ,因为它具有更好的输出。
杰里米·库克

2
很高兴我向下滚动。我立刻看到了被接受的答案,希望有一个安全的方法可以做到这一点。
frostymarvelous

HttpUtility.JavaScriptStringEncode版本还对JSON中的引号进行编码,如果直接在脚本[type ='application / json']中使用引号,则使其无效。
Pete Kirkham

1
未来自我注意:您要使用的是:@ Html.Raw(Json.Encode())
Pangamma

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.