【问题标题】:Overwriting the Array constructor does not affect [], right?覆盖 Array 构造函数不会影响 [] 对吧?
【发布时间】:2009-06-27 20:33:31
【问题描述】:

我刚刚读到:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

我的印象是覆盖 ObjectArray 只有在创建 @987654324 时选择使用构造函数才有效@/objects,但是,根据那篇文章,它也对文字创建有影响({}[] )...

我的逻辑:

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

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

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

那么,我是疯了还是有一些我不知道的特定于实现的怪癖?

【问题讨论】:

    标签: javascript security arrays xss


    【解决方案1】:

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

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

    【讨论】:

    • 完美!感谢您的链接:)
    【解决方案2】:

    EcmaScript 5 草案将 Josef 提到的这个修复标准化。它根据 Array 全局值在上下文创建时指定数组构造函数的行为,如第 11.1.4 节所述。

    语义

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

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

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

    语义

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

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

    也就是说,不要依赖 [] 明智地使用年长的口译员。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 根据 EcmaScript 262 规范的第 11.4.1 节不正确。
      猜你喜欢
      • 2018-05-28
      • 1970-01-01
      • 2014-06-09
      • 2014-04-11
      • 1970-01-01
      • 2011-09-25
      • 2020-04-29
      • 1970-01-01
      • 2015-02-01
      相关资源
      最近更新 更多