2010-11-01 8 views
133

Ich versuche, ein Objekt als JSON meiner Asp.Net MVC-Ansicht mit Razor, wie so zu schreiben:Wie schreibe ich unverschlüsselte Json zu meiner Ansicht mit Razor?

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

Das Problem, dass die JSON in der Ausgabe codiert ist, und mein Browser nicht mag ich. Zum Beispiel:

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

Wie bekomme ich Razor uncodierten JSON zu emittieren?

+2

+1 für die gute Frage. Ich habe nach einem Post gesucht, um das zu fragen, aber du hast mir das Tippen gerettet .... – gyurisc

Antwort

171

Sie tun:

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

In Versionen früher als Beta 2 Sie haben es mag:

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

Was kann ich tun, wenn ich etwas kodierten Text in meinen Objekteigenschaften haben möchte? \, {\ "UrlPart \: \" TjcolklFX5c \ ", \" Title \ ": \" Wenn Mama Isn \ u0026t Home \ "} {\" \ " Zum Beispiel. Dies wird brechen, weil js denkt 'wird die native String decalration von var eine Flucht =' 'gleiche gilt für "". anny Idee? – SomeRandomName

+0

@SomeRandomName Sie 'javascriptserializer' dafür wie können' @ Html.Raw (javascriptSerializerObjecct.Serialize (myObject)) ' – vikscool

+0

Wir sind in 2017, mit MVC 5 und diese Antwort ist immer noch perfekt! –

9

Mit Newtonsoft

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

Newtonsoft des JsonConvert.SerializeObject verhält sich nicht das gleiche wie Json.Encode und zu tun, was @ david-k-egghead vorschlägt, öffnet dich bis XSS-Angriffe.

Lassen Sie diesen Code in eine Razor-Ansicht fallen, um zu sehen, dass die Verwendung von Json.Encode sicher ist und dass Newtonsoft im JavaScript-Kontext sicher gemacht werden kann, aber nicht ohne zusätzliche Arbeit.

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

Siehe auch:

+0

Haben Sie eine Idee, wenn sie Json.Encode hinzugefügt? Ich wusste nicht, dass es war eigentlich eine sichere Möglichkeit, Json auf der Seite einzufügen, und ich weiß, dass ich in der Vergangenheit viel darüber geforscht habe. –

+1

'Json.Encode' gibt es schon so lange, wie ich mich erinnern kann, aber der Nachteil ist, dass es Microsofts Implementierung verwendet, die Nicht-Standard-Daten ausgibt (und andere lästige Dinge tun kann). Ich benutze und ermutige die Verwendung von Newtonsofts "JsonConvert.SerializeObject" kombiniert mit richtigem Escaping, weil es eine bessere Ausgabe hat. –

+2

Froh, dass ich runterscrollte. Sofort sah ich die akzeptierte Antwort, ich hoffte, dass es einen sicheren Weg dafür gab. – frostymarvelous

Verwandte Themen