In ASP.Net 5 befindet sich eine JsonHelper
direkt in den Rasierer Ansichten über @Json.Serialize
, so dass Sie in Ihren Rasierer Blick so etwas schreiben:
var foo = @Json.Serialize(model);
Dies ist sehr ähnlich zu tun manuell:
Das Problem in beiden Fällen ist, dass JSON.Net standardmäßig serialisiert, aber nicht XSS-die Ausgabe bereinigt. Dies bedeutet, dass der Inhalt von Modell nicht maskiert ist, sodass der Code für XSS attacks offen bleibt, wenn das Modell von Benutzereingaben abhängig ist. Zum Beispiel:
@{
var model = new
{
prop1 = 1,
prop2 = "</script><script>alert('o hai');</script>",
prop3 = false
};
}
var foo = @Json.Serialize(model);
könnten Sie verwenden die Json.Serialize
Überlastung, die Sie JsonSerializerSettings
angeben können, so können Sie StringEscapeHandling
als escape gesetzt:
HTML (<,>, &‘,„) und Kontrolle Zeichen (zB newline) sind entkommen.
var foo = @Json.Serialize(model, new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml });
PS. ich habe angehoben ein Problem auf github zu Standard-HTML-Escaping in der JsonHelper enthalten.
Ansätze in früheren Versionen verwendet
Wenn Sie diese gleiche Frage auf Stack-Überlauf, finden Sie dort gebraucht ein Json.Encode
Helfer in früheren Versionen von MVC zu sein, so dass Sie like this serialisiert konnten, manuell durchführen die JS Serialisierung. Dies scheint durch Json.Serialize
ersetzt, die standardmäßig nicht sicher ist.
Dort war auch ein Helfer HttpUtility.JavaScriptStringEncode
, der verwendet werden könnte, um json-Literale manuell zu kodieren. Dies scheint in ASP.Net 5 als IJavaScriptStringEncoder
zu sein. Das einzige Problem ist, dass es, wenn es mit Newtonsoft.Json (dem Standard-Json-Formatierer in ASP.Net 5) kombiniert wird, zu viel für ein gültiges Json-Literal codiert (wie die doppelten Anführungszeichen in Eigenschaftsnamen). Allerdings wird es eine gültige Zeichenfolge produzieren, die auf dem Browser mit JSON.parse analysiert werden können (also wahrscheinlich this approach sollte auch funktionieren):
@inject Microsoft.Extensions.WebEncoders.IJavaScriptStringEncoder encoder;
...
var foo = JSON.parse("@encoder.JavaScriptStringEncode(JsonConvert.SerializeObject(model))");
auch bewusst sein, dass auf dem neuesten Quellcode sucht, wird die IJavaScriptStringEncoder
sein ersetzt durch System.Text.Encodings.Web.JavaScriptEncoder
in RC2.
in Debugger es auf diese Weise zeigt –
Sie könnten JIL versuchen (Disclaimer dies war ein Tool von SO gemacht) https://github.com/kevin-montrose/Jil – Pseudonym