2012-04-28 80 views
2

我学习卡哈,我感到困惑的“本” -stealing概念:一个JavaScript漏洞 - “这个” -stealing:

另一个安全漏洞,卡哈地址被称为“本“ 偷窃 - 如果对象的客户端可以将方法添加到该对象的 状态,该状态的别名为”this“,则上述受保护的”此“ 规则不适用。

然后,他们表现出了下面的构造:

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

有涉及 “X_” 隐藏泄漏:

下面的代码可以使表达揭示秘密值:

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

这是如何工作的?为什么会出现这样的问题?我很欣赏任何提示或建议。

回答

2

简化IT:

(new Cell()).value() 

我们正在创造从细胞构造一个新的对象,并立即调用它的价值的方法。当然值法没有做任何事情,这就是我们的下一个部分进来:

function(){ 
    return this.x_; 
} 

这是我们传递什么到构造函数中的参数value。此函数在Cell构造函数中分配给this.value

因此单元构造有效看起来像现在这样:

当您创建从小区一个新的对象,并调用其 value成员
function Cell(value) { 
    this.x_ = "secret"; 
    this.value = function(){ 
    return this.x_; 
    }; 
} 

所以会发生什么?内部函数返回Cell对象的x_值,从而揭示秘密文本。

+1

非常感谢Jonathan - 我明白了! JavaScript非常强大! – Coffee 2012-04-28 05:06:48

+1

如果我想成为'x_'的秘密,我将它声明为'var x_ =“secret”;',而不是'this.x_ =“secret”;'。在这种情况下,“攻击”立即停止工作。任何我在一个对象构造函数中绑定到'this'的方法都是*根据定义*不是秘密。我甚至可以用'for .. in'自由地枚举它,而不需要向后弯曲以查看它的值。我不明白 - 所有这一切在哪里? – Tomalak 2012-04-28 05:13:47

+0

@Tomalak我在想我自己。本书中的代码绝对是最好的例子,但是很明显它的意图是什么。 – Sampson 2012-04-28 05:17:55