2009-06-27 3 views
12

ich das gerade gelesen: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspxDas Überschreiben des Array-Konstruktors wirkt sich nicht auf [] aus, richtig?

Ich hatte den Eindruck, dass das Überschreiben Object oder Array nur dann eine Wirkung hatte, wenn Sie die Konstruktor-Funktionen verwenden gewählt haben, als arrays/objects zu schaffen, aber, gemäß diesem Artikel, hat es auch Auswirkungen auf die literale Erstellung ({} und []) ...

Meine Logik:

Array = function(){ alert('Hi'); }; 

[1,2,3,4,5]; 
([1,2,3,4,5]); 
var a = [1,2,3,4,5]; 

// ... 
// ... Nothing is alerted 

Also, bin ich verrückt zu werden oder gibt es einige implementierungsspezifische Macken ich nicht bewusst bin?

Antwort

14

Soweit ich weiß, ist dies ein Problem mit der ECMAScript-Spezifikation und wurde vor über einem Jahr in allen gängigen Browsern behoben. Here ist ein Link, der Sie zu den relevantesten Verbindungen verknüpft;)

Aber tatsächlich Ihre Frage zu beantworten, ja, die Object und Array Bauer sind auch für wörtliche Kreationen aufgerufen. Die implementierten Fix Browser haben diese (und andere) einfach konstant gemacht, so dass sie nicht von benutzerdefinierten Skripten überschrieben werden können.

+1

Perfekt! Danke für den Link :) – James

0

Wenn Sie Array als Funktion festlegen, überschreiben Sie nicht den Konstruktor von Arrays, sondern ersetzen die Funktion.

Um den Konstruktor korrekt zu überschreiben, würden Sie den Array.prototype verwenden. defineSetter, um die aufgerufene Methode für die Konstruktion zu setzen, und dies würde sowohl bei new Array() als auch bei Verwendung der Literalnotation aufgerufen werden.

+1

Nicht zutreffend gemäß Abschnitt 11.4.1 der EcmaScript 262-Spezifikation. –

5

Der EcmaScript 5-Entwurf standardisiert diesen Fix, den Josef erwähnt. Sie gibt das Verhalten des Array-Konstruktors in Bezug auf den Wert des globalen Array zum Zeitpunkt der Kontext-Erstellung an, wie in Abschnitt 11.1.4 beschrieben.

Semantiken

Die Produktion wird ArrayLiteral : [ Elisionopt ] wie folgt bewertet:

  1. Array das Ergebnis ein neues Objekt wie durch den Ausdruck zu schaffen new Array() sein lassen, wo Array die Standard-eingebaut ist Konstruktor mit diesem Namen.

Anstelle des alten ES 262 Verhalten, das zum Ersetzen des Array-Konstruktor erlaubt:

Semantics

Die Produktion ArrayLiteral : [ Elisionopt ] wie folgt bewertet wird:

  1. erstellen neues Array als ob durch den Ausdruck new Array().

Das heißt, verlassen sich nicht auf [] vernünftig auf ältere Dolmetscher arbeiten.