
Der JSON Sanitizer konvertiert JSON-ähnlichen Inhalt in gültiges JSON.
Bei JSON-ähnlichem Inhalt wandelt der JSON Sanitizer diesen in gültiges JSON um.
Diese Bibliothek kann an beiden Enden einer Daten-Pipeline angebracht werden, um das Postelsche Prinzip zu erfüllen:
Sei konservativ bei dem, was du tust, und liberal bei dem, was du von anderen akzeptierst.
Angewandt auf JSON-ähnlichen Inhalt von anderen erzeugt sie wohlgeformtes JSON, das jeden von dir verwendeten Parser zufriedenstellen sollte.
Angewandt auf deine Ausgabe, bevor du sie sendest, gleicht sie kleinere Kodierungsfehler aus und erleichtert es, dein JSON in HTML und XML einzubetten.

Viele Anwendungen verfügen über große Mengen an Code, der mit Ad-hoc-Methoden JSON-Ausgaben erzeugt.
Häufig durchlaufen diese Ausgaben alle eine kleine Menge Framework-Code, bevor sie über das Netzwerk gesendet werden. Diese kleine Menge Framework-Code kann diese Bibliothek verwenden, um sicherzustellen, dass die Ad-hoc-Ausgaben standardkonform sind und sicher an (übermäßig) mächtige Deserialisierer wie den eval-Operator von Javascript übergeben werden können.
Anwendungen haben außerdem oft Web-Service-APIs, die JSON aus verschiedenen Quellen empfangen. Wenn dieses JSON mit Ad-hoc-Methoden erstellt wurde, kann diese Bibliothek es in eine Form bringen, die leicht zu parsen ist.
Indem diese Bibliothek in den Code eingebunden wird, der Anfragen und Antworten sendet und empfängt, kann sie Softwarearchitekten dabei helfen, systemweite Sicherheits- und Wohlgeformtheitsgarantien sicherzustellen.
Der Sanitizer nimmt JSON-ähnlichen Inhalt entgegen und interpretiert ihn so, wie JS eval es tun würde. Konkret behandelt er diese nicht standardkonformen Konstrukte.
Der Sanitizer behebt fehlende Satzzeichen, fehlende End-Anführungszeichen sowie nicht zusammenpassende oder fehlende schließende Klammern. Wenn eine Eingabe nur Leerzeichen enthält, wird die gültige JSON-Zeichenkette null eingesetzt.
Die Ausgabe ist wohlgeformtes JSON, wie in RFC 4627 definiert. Die Ausgabe erfüllt diese zusätzlichen Eigenschaften:
"<script", "</script" oder "<!--" nicht und kann daher ohne weitere Kodierung in ein HTML-Script-Element eingebettet werden."]]>" nicht und kann daher ohne weitere Kodierung in einen XML-CDATA-Abschnitt eingebettet werden.eval-Builtin (nach dem Einklammern) oder von JSON.parse geparst werden. Insbesondere enthält die Ausgabe keine Zeichenkettenliterale mit eingebetteten JS-Zeilenumbrüchen (U+2028 Paragraph Separator oder U+2029 Line Separator).Da die Ausgabe wohlgeformtes JSON ist, hat die Übergabe an eval keine Nebenwirkungen und keine freien Variablen; sie ist also weder ein Vektor für Code-Injection noch ein Vektor für die Exfiltration von Geheimnissen.
Diese Bibliothek stellt nur sicher, dass die Phase JSON-Zeichenkette → Javascript-Objekt keine Nebenwirkungen hat und keine freien Variablen auflöst; sie kann nicht kontrollieren, wie anderer clientseitiger Code das resultierende Javascript-Objekt später interpretiert. Wenn clientseitiger Code also einen Teil der geparsten Daten, der von einem Angreifer kontrolliert wird, an einen mächtigen Interpreter wie eval oder innerHTML zurückgibt, kann dieser clientseitige Code unbeabsichtigte Nebenwirkungen erleiden.
var myValue = eval(sanitizedJsonString); // safe
var myEmbeddedValue = eval(myValue.foo); // possibly unsafe
Darüber hinaus kann das Bereinigen von JSON eine Anwendung nicht vor Confused-Deputy-Angriffen schützen.
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
Die Sanitize-Methode gibt die Eingabezeichenkette zurück, ohne einen neuen Puffer zu allokieren, wenn die Eingabe bereits gültiges JSON ist, das die obigen Eigenschaften erfüllt. Wenn sie also für Eingaben verwendet wird, die normalerweise wohlgeformt sind, hat sie einen minimalen Speicher-Overhead.
Die Sanitize-Methode benötigt O(n) Zeit, wobei n die Länge der Eingabe in UTF-16-Code-Einheiten ist.
| Konstrukt | Behandlung |
|---|
'...' | In einfache Anführungszeichen gesetzte Zeichenketten werden in JSON-Zeichenketten umgewandelt. |
\xAB | Hexadezimale Escapesequenzen werden in JSON-Unicode-Escapes umgewandelt. |
\012 | Oktale Escapesequenzen werden in JSON-Unicode-Escapes umgewandelt. |
0xAB | Hexadezimale Integer-Literale werden in JSON-Dezimalzahlen umgewandelt. |
012 | Oktale Integer-Literale werden in JSON-Dezimalzahlen umgewandelt. |
+.5 | Dezimalzahlen werden in das strengere JSON-Format gezwungen. |
[0,,2] | Auslassungen in Arrays werden mit null aufgefüllt. |
[1,2,3,] | Nachgestellte Kommas werden entfernt. |
{foo:"bar"} | Nicht in Anführungszeichen gesetzte Eigenschaftsnamen werden in Anführungszeichen gesetzt. |
//comments | Zeilen- und Blockkommentare im JS-Stil werden entfernt. |
(...) | Gruppierungsklammern werden entfernt. |