Ich verwende Backbone.js und den Tornado-Webserver. Das Standardverhalten für den Empfang von Erfassungsdaten in Backbone ist das Senden als JSON-Array.
Andererseits besteht das Standardverhalten von Tornado darin, JSON-Arrays aufgrund der folgenden Sicherheitsanfälligkeit nicht zuzulassen:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Ein verwandter ist: http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Es fühlt sich für mich natürlicher an, meinen JSON nicht in ein Objekt einwickeln zu müssen, wenn es sich wirklich um eine Liste von Objekten handelt.
Ich konnte diese Angriffe in modernen Browsern (z. B. Chrome, Firefox, Safari und IE9) nicht reproduzieren. Gleichzeitig konnte ich nirgendwo bestätigen, dass moderne Browser diese Probleme behoben hatten.
Um sicherzustellen, dass ich weder durch mögliche schlechte Programmierkenntnisse noch durch schlechte Googeln-Fähigkeiten irregeführt werde:
Sind diese JSON-Hijacking-Angriffe in modernen Browsern noch heute ein Problem?
(Hinweis: Entschuldigen Sie das mögliche Duplikat zu: Ist es möglich, "JSON-Hijacking" in einem modernen Browser durchzuführen? Da die akzeptierte Antwort die Frage jedoch nicht zu beantworten scheint, dachte ich, es sei Zeit, sie erneut zu stellen und klarere Erklärungen zu erhalten .)
Antworten:
Nein, es ist nicht mehr möglich, Werte zu erfassen, die in Firefox 21, Chrome 27 oder IE 10 an die
[]
oder{}
Konstruktoren übergeben wurden. Hier ist eine kleine Testseite, die auf den unter http://www.thespanner.co.uk beschriebenen Hauptangriffen basiert / 2011/05/30 / json-hijacking / :( http://jsfiddle.net/ph3Uv/2/ )
Es überschreibt
window.Array
und fügt einen Setter hinzuObject.prototype.foo
und testet die Initialisierung von Arrays und Objekten über die kurzen und langen Formulare.Die ES4-Spezifikation in Abschnitt 1.5 "erfordert, dass die globalen Standardbindungen von Object und Array verwendet werden, um neue Objekte für Objekt- und Array-Initialisierer zu erstellen" und stellt in Implementation Precedent fest, dass "Internet Explorer 6, Opera 9.20 und Safari 3 dies tun Beachten Sie weder lokale noch globale Neubindungen von Object und Array, sondern verwenden Sie die ursprünglichen Object- und Array-Konstruktoren. " Dies wird in ES5, Abschnitt 11.1.4 beibehalten .
Allen Wirfs-Brock erklärte, dass ES5 auch angibt, dass die Objektinitialisierung keine Setter auslösen soll, da DefineOwnProperty verwendet wird. MDN: Arbeiten mit Objekten stellt fest, dass "Ab JavaScript 1.8.1 werden Setter nicht mehr aufgerufen, wenn Eigenschaften in Objekt- und Array-Initialisierern festgelegt werden." Dies wurde in V8-Ausgabe 1015 behoben .
quelle