J'essaie d'écrire un objet au format JSON dans mon Asp.Net MVC View à l'aide de Razor, comme suit:
<script type="text/javascript">
var potentialAttendees = @Json.Encode(Model.PotentialAttendees);
</script>
Le problème est que, dans la sortie, le code JSON est codé et que mon navigateur ne l’aime pas. Par exemple:
<script type="text/javascript">
var potentialAttendees = [{"Name":"Samuel Jack"},];
</script>
Comment faire en sorte que Razor émette du code JSON non codé?
Tu fais:
@Html.Raw(Json.Encode(Model.PotentialAttendees))
Dans les versions antérieures à la version bêta 2, vous l’avez fait comme:
@(new HtmlString(Json.Encode(Model.PotentialAttendees)))
Newtonsoft's JsonConvert.SerializeObject
ne se comporte pas comme Json.Encode
et en faisant ce que suggère @ david-k-egghead, vous ouvrez jusqu'à attaques XSS .
Déposez ce code dans une vue Razor pour voir que l'utilisation de Json.Encode
est sécurisé et que Newtonsoft peut être sécurisé dans le contexte JavaScript, mais cela ne va pas sans quelques efforts supplémentaires.
<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>
Voir également:
Utiliser Newtonsoft
<script type="text/jscript">
var potentialAttendees = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees)))
</script>