Es verhindert die Offenlegung der Antwort durch JSON-Hijacking.
Theoretisch ist der Inhalt von HTTP-Antworten durch die Richtlinie für denselben Ursprung geschützt: Seiten einer Domäne können keine Informationen von Seiten der anderen Domäne abrufen (sofern dies nicht ausdrücklich gestattet ist).
Ein Angreifer kann in Ihrem Namen Seiten in anderen Domänen anfordern, z. B. mithilfe eines Tags <script src=...>
oder <img>
, kann jedoch keine Informationen über das Ergebnis (Header, Inhalt) abrufen.
Wenn Sie also die Seite eines Angreifers besuchen, konnte diese Ihre E-Mail von gmail.com nicht lesen.
Wenn Sie jedoch ein Skript-Tag zum Anfordern von JSON-Inhalten verwenden, wird JSON in der kontrollierten Umgebung eines Angreifers als Javascript ausgeführt. Wenn der Angreifer den Array- oder Objektkonstruktor oder eine andere Methode ersetzen kann, die während der Objektkonstruktion verwendet wird, wird alles im JSON durch den Code des Angreifers geleitet und offengelegt.
Beachten Sie, dass dies zum Zeitpunkt der Ausführung des JSON als Javascript geschieht und nicht zum Zeitpunkt der Analyse.
Es gibt mehrere Gegenmaßnahmen:
Stellen Sie sicher, dass JSON niemals ausgeführt wird
Durch Platzieren einer while(1);
Anweisung vor den JSON-Daten stellt Google sicher, dass die JSON-Daten niemals als Javascript ausgeführt werden.
Nur eine legitime Seite kann den gesamten Inhalt while(1);
abrufen, den Inhalt entfernen und den Rest als JSON analysieren.
Dinge wie for(;;);
zum Beispiel wurden bei Facebook gesehen, mit den gleichen Ergebnissen.
Stellen Sie sicher, dass JSON kein gültiges Javascript ist
In ähnlicher Weise wird durch Hinzufügen ungültiger Token vor dem JSON &&&START&&&
sichergestellt, dass er niemals ausgeführt wird.
Geben Sie JSON immer mit einem Objekt an der Außenseite zurück
Dies wird OWASP
empfohlen , um sich vor JSON-Hijacking zu schützen, und ist weniger aufdringlich.
Ähnlich wie bei den vorherigen Gegenmaßnahmen wird sichergestellt, dass der JSON niemals als Javascript ausgeführt wird.
Ein gültiges JSON-Objekt ist in Javascript nicht gültig, wenn es von nichts eingeschlossen ist:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Dies ist jedoch gültig JSON:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Stellen Sie daher sicher, dass Sie immer ein Objekt auf der obersten Ebene der Antwort zurückgeben. Stellen Sie sicher, dass JSON kein gültiges Javascript ist, während JSON weiterhin gültig ist.
Wie von @hvd in den Kommentaren angegeben, ist das leere Objekt {}
gültiges Javascript, und das Wissen, dass das Objekt leer ist, kann selbst eine wertvolle Information sein.
Vergleich der obigen Methoden
Der OWASP-Weg ist weniger aufdringlich, da keine Änderungen an der Clientbibliothek erforderlich sind und gültiger JSON übertragen wird. Es ist jedoch nicht sicher, ob frühere oder zukünftige Browserfehler dies verhindern könnten. Wie von @oriadam festgestellt, ist unklar, ob bei einem Analysefehler durch eine Fehlerbehandlung Daten verloren gehen könnten oder nicht (z. B. window.onerror).
Der Weg von Google erfordert, dass die Client-Bibliothek die automatische De-Serialisierung unterstützt, und kann als sicherer in Bezug auf Browser-Fehler angesehen werden.
Beide Methoden erfordern serverseitige Änderungen, um zu verhindern, dass Entwickler versehentlich anfälliges JSON senden.