2009-06-27 18 views
12

acabo de leer esto: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspxSobrescribir el constructor Array no afecta a [], ¿verdad?

Yo tenía la impresión de que la sobreescritura Object o Array sólo tenía un efecto, si opta por utilizar las funciones constructoras al crear arrays/objects, pero, de acuerdo con ese artículo, también tiene un efecto en la creación literal ({} y []) ...

Mi lógica:

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

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

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

Así, Me estoy volviendo loco o hay algunas peculiaridades específicas de la implementación que no estoy al tanto?

Respuesta

14

Hasta donde yo sé, este es un problema con la especificación ECMAScript y se corrigió en todos los principales navegadores hace más de un año. Here es un enlace que une a los enlaces más relevantes;)

Pero para responder a su pregunta en realidad, sí, los Object y Array constructores se invocan también para las creaciones literales. Los navegadores fix implementados han hecho que estos (y otros) sean constantes para que no puedan ser reemplazados por scripts personalizados.

+1

¡Perfecto! Gracias por el enlace :) – James

0

Al configurar Array para que sea una función, no está anulando el constructor de matrices, sino que reemplaza la función.

Para anular correctamente el constructor, debe utilizar el Array.prototype. defineSetter para establecer el método al que se llama en la construcción, y esto se denominaría tanto en la nueva matriz() como cuando se utiliza la notación literal.

+1

No es cierto de acuerdo con la sección 11.4.1 de la especificación EcmaScript 262. –

5

El borrador de EcmaScript 5 estandariza esta solución que Josef menciona. Especifica el comportamiento del constructor de la matriz en términos del valor de la matriz global en el momento en que se creó el contexto, como se describe en la sección 11.1.4.

Semántica

La producción ArrayLiteral : [ Elisionopt ] se evalúa como sigue:

  1. Vamos array ser el resultado de la creación de un nuevo objeto como si por la expresión new Array() donde Array es el estándar incorporado constructor con ese nombre.

En lugar de la vieja ES 262 comportamiento que permitió la sustitución de la constructor Array:

Semántica

La producción ArrayLiteral : [ Elisionopt ] se evalúa como sigue:

  1. Crear una nueva matriz como si fuera por la expresión new Array().

Dicho esto, no se basan en [] trabajar con sensatez en intérpretes de mayor edad.

Cuestiones relacionadas