2

我正在学习 Caja,但我对“this”-stealing 的概念感到困惑:

Caja 解决的另一个安全漏洞称为“this”窃取——如果对象的客户端可以向对象的状态添加别名“this”的方法,则上述受保护的“this”规则不适用。

然后他们显示以下构造函数:

function Cell(value) {
  this.x_ =  "secret";
  this.value = value;
}

有一个涉及 "x_" 的隐藏泄漏:

以下代码可以使表达式揭示该秘密值:

(new Cell(
  function (){
    return this.x_;
  })).value()

这是如何运作的?为什么会出现这样的问题?我感谢任何提示或建议。

4

1 回答 1

2

简化它:

(new Cell( )).value()

我们从 Cell 构造函数创建一个新对象,并立即调用它的 value 方法。当然 value 方法还没有做任何事情,这就是我们下一部分的用武之地:

function (){ 
  return this.x_; 
}

这就是我们作为value参数传递给构造函数的内容。this.value此函数在 Cell 构造函数中分配。

所以 Cell 构造函数现在看起来像这样:

function Cell(value) {
  this.x_ =  "secret";
  this.value = function (){ 
    return this.x_; 
  };
}

那么当你从 Cell 创建一个新对象并调用它的value成员时会发生什么?内部的一个函数返回 Cell 对象的x_值,从而揭示秘密文本。

于 2012-04-28T04:56:47.707 回答