16 Stimmen

Welche Art von json-Antwort beginnt mit )]}'

Mir ist aufgefallen, dass einige json-Abfragen, insbesondere in den Google-Diensten, ein merkwürdiges "json" zurückgeben, das mit einer abschließenden Sequenz beginnt und dann nur eine Array-Struktur hat, die mit eckigen Klammern angegeben wird.

Was für eine Art von Ajax ist das? Gibt es eine Bibliothek, js oder py, Parsing es?

Um ein konkreteres Beispiel zu nennen:

>>> import json
>>> import urllib2
>>> url=urllib2.urlopen("https://plus.google.com/u/0/_/socialgraph/lookup/visible/?o=%5Bnull%2Cnull%2C%22114423404493486623226%22%5D")
>>> url.readline()
")]}'\n"
>>> url.readline()
'\n'
>>> url.readline()
'[["tsg.lac",[]\n'

und von dort aus folgt eine typische Anordnung. Die vollständige Antwort ist also ein zweizeiliger "Header" und dann ein Array, aber der "Header" ist sehr rätselhaft und ich frage mich, ob er aus einer Standard-Ajax-Bibliothek stammt oder nur eine Idee dieser Jungs ist.

Wenn Sie die Entwickler-Tools von Chrome verwenden, um die tatsächlichen Abfragen zu untersuchen, sehen Sie dasselbe. Ich bin also zu der Überzeugung gelangt, dass es sich um eine tatsächliche Antwort und nicht um ein Artefakt der Abfrage handelt.

21voto

Dave Ward Punkte 58382

Die Verwendung von ungültigem JSON am Anfang einer Nachricht ist eine Möglichkeit, eine Kombination aus CSRF und ein trickreicher Angriff auf den Array-Konstruktor von JavaScript .

Wenn diese URL ein gültiges, unverpacktes Array zurückgibt, könnte jede von Ihnen besuchte Website die Array-Funktion überladen, einen Skriptverweis auf diese Google+-URL auf der Seite platzieren/einfügen und Ihre privaten/sicheren Daten abfangen, wenn Sie einfach ihre Seite laden.

Googles eigener client-seitiger Code kann dieses ungültige JSON vor dem Parsen entfernen, da er eine herkömmliche XHR-Anfrage verwendet, die ihm Zugriff auf die rohe Antwort gibt. Eine entfernte Website kann nur über eine Skriptelementinjektion darauf zugreifen und hat keine Möglichkeit, die Daten vorzubearbeiten, bevor der Browser sie parst. Letzteres ist vergleichbar mit der Funktionsweise von JSONP, wobei der Array-Konstruktor unwissentlich zur Callback-Funktion wird.

Ein ähnlicher Ansatz findet sich auf vielen bekannten Websites, die JSON-Arrays als Antwort auf GET-Anfragen zurückgeben. Facebook polstert seine mit for (;;); zum Beispiel. Wenn Sie versuchen, den CSRF-Angriff auf diese Facebook-APIs anzuwenden, tritt der Browser einfach in eine Endlosschleife auf der entfernten Website ein und verweist auf die private API von Facebook. Auf Facebook.com hat der clientseitige Code die Möglichkeit, diese zu entfernen, bevor er eine JSON.parse() ausführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X