覆盖Array构造函数不会影响[],对吧?

时间:2009-06-27 20:33:32

标签: javascript security arrays xss

我刚读过这篇文章: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

我的印象是,如果您在创建<时选择使用构造函数,则覆盖 Object Array 只会产生影响strong> arrays / objects ,但根据该文章,它也会对文字创建产生影响( {} < / strong>和 [] )...

我的逻辑:

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

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

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

那么,我是否会发疯或者是否存在一些我不知道的特定于实现的怪癖?

3 个答案:

答案 0 :(得分:14)

据我所知,这是ECMAScript规范的一个问题,并在一年前的所有主流浏览器中得到修复。 Here是一个链接,可将您链接到最相关的链接;)

但是要真正回答你的问题,是的,ObjectArray构造函数也会被用于文字创作。实现的修复浏览器只是使这些(和其他)不变,因此它们不能被自定义脚本覆盖。

答案 1 :(得分:5)

EcmaScript 5草案标准化了约瑟夫提到的这个修正案。它根据11.1.4节中描述的创建上下文时Array Array的值来指定数组构造函数的行为。

  

语义

     

生产ArrayLiteral : [ Elisionopt ]的评估如下:

     
      
  1. 让数组成为创建新对象的结果,就像通过表达式一样   new Array()其中Array是具有该名称的标准内置构造函数。
  2.   

而不是允许替换Array构造函数的旧ES 262行为:

  

语义

     

生产ArrayLiteral : [ Elisionopt ]的评估如下:

     
      
  1. 创建一个新数组,就像使用表达式new Array()
  2. 一样   

尽管如此,不要依赖[]合理地对老口译员工作。

答案 2 :(得分:0)

通过将Array设置为函数,您不会覆盖数组的构造函数,而是替换函数。

要正确覆盖构造函数,可以使用Array.prototype。 defineSetter 来设置构造时调用的方法,这将在new Array()和使用文字表示法时调用。