如何使用 Razor 将未编码的 Json 写入我的 View?

我尝试用 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?

84887 次浏览

你可以:

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

在早于 Beta 2的版本中,你是这样做的:

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

使用牛顿软件

<script type="text/jscript">
var potentialAttendees  = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees)))
</script>

牛顿软件的 JsonConvert.SerializeObjectJson.Encode的表现不同,它所做的就是@david-k-egghead 所建议的,为你打开 XSS 攻击的大门。

将这段代码放到一个 Razor 视图中,看看使用 Json.Encode是否安全,以及 Newtonsoft 在 JavaScript 上下文中是否安全,但这并不意味着没有额外的工作。

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

参见: