web-dev-qa-db-fra.com

Comment écrire Json non codé dans ma vue à l'aide de Razor?

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 = [{&quot;Name&quot;:&quot;Samuel Jack&quot;},];
</script>

Comment faire en sorte que Razor émette du code JSON non codé?

145
Samuel Jack

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)))
185
Lorenzo

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:

41
Jeremy Cook

Utiliser Newtonsoft

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