asp.net-mvc - update - render partial view mvc 5 ajax
¿Cómo escribo Json sin codificar en mi View usando Razor? (3)
Estoy intentando escribir un objeto como JSON en mi Asp.Net MVC View usando Razor, así:
<script type="text/javascript">
var potentialAttendees = @Json.Encode(Model.PotentialAttendees);
</script>
El problema es que en el resultado el JSON está codificado, y a mi navegador no le gusta. Por ejemplo:
<script type="text/javascript">
var potentialAttendees = [{"Name":"Samuel Jack"},];
</script>
¿Cómo hago que Razor emita JSON sin codificar?
El JsonConvert.SerializeObject de JsonConvert.SerializeObject
no se comporta de la misma manera que Json.Encode
y hacer lo que @ david-k-egghead sugiere te abre a los ataques XSS .
Suelte este código en una vista Razor para ver que el uso de Json.Encode
es seguro, y que Newtonsoft puede hacerse seguro en el contexto de JavaScript, pero no deja de tener un trabajo adicional.
<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>
Ver también:
Tú lo haces:
@Html.Raw(Json.Encode(Model.PotentialAttendees))
En versiones anteriores a Beta 2 lo hiciste como:
@(new HtmlString(Json.Encode(Model.PotentialAttendees)))
Usando Newtonsoft
<script type="text/jscript">
var potentialAttendees = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees)))
</script>