Javascript 为什么呼叫者不安全?
以下似乎是对调用方的合理使用:Javascript 为什么呼叫者不安全?,javascript,Javascript,以下似乎是对调用方的合理使用: var foo=1; function a() { var foo=2; function b() { var foo=3; foo; // 3 this.foo; // 1, from global __caller__.foo // 2 } b(); } a(); // creates a's execution context 但是,\uuuuuu调用者\uuu
var foo=1;
function a() {
var foo=2;
function b() {
var foo=3;
foo; // 3
this.foo; // 1, from global
__caller__.foo // 2
}
b();
}
a(); // creates a's execution context
但是,
\uuuuuu调用者\uuuuu
不可用。为什么不呢?如果可以使用this
访问全局上下文/变量对象,那么为什么不使用a
呢?我对这个主题不太熟悉,但是您是否尝试过参数.callee.caller
请参见此处:我对这个主题不太熟悉,但您是否尝试过
参数.callee.caller
请参见此处:在您的示例中,您可以认为
b
中的内容应该能够在a
的活动实例中解决问题,这似乎是合理的,因为a
包含b
。但如果不是这样,就说你定义了
function c() {
var foo='hedgehog';
b();
}
这完全是另一回事,所以你的论点似乎适用于一个非常特殊的情况。在你的例子中,你可以说
b
中的东西应该能够在a
的活动实例中解决问题,这似乎是合理的,因为a
包含b
。但如果不是这样,就说你定义了
function c() {
var foo='hedgehog';
b();
}
这完全是另外一回事,所以你的论点似乎适用于一个非常特殊的情况。:
出于安全原因,删除了返回调用者的激活对象从而允许重建堆栈的特殊属性_caller _;
很容易看出,在大部分UI都是用JavaScript实现的浏览器中,这可能是一场安全灾难。想象一下,有一个附加组件或其他chrome调用您的函数。您可以查找调用堆栈并读取调用者(可能是敏感的)变量,甚至可以将JavaScript值注入调用者函数中,这可能会破坏它们,从而违背用户的意愿。实际上,每个网页都会获得chrome安全权限,并完全破坏浏览器
您当然不应该在真正的JavaScript中使用它,因为它是一个非标准的Mozilla专用实现细节,更不用说难以置信的丑陋了。它没有您通常期望的JS的词汇行为。:
出于安全原因,删除了返回调用者的激活对象从而允许重建堆栈的特殊属性_caller _;
很容易看出,在大部分UI都是用JavaScript实现的浏览器中,这可能是一场安全灾难。想象一下,有一个附加组件或其他chrome调用您的函数。您可以查找调用堆栈并读取调用者(可能是敏感的)变量,甚至可以将JavaScript值注入调用者函数中,这可能会破坏它们,从而违背用户的意愿。实际上,每个网页都会获得chrome安全权限,并完全破坏浏览器
您当然不应该在真正的JavaScript中使用它,因为它是一个非标准的Mozilla专用实现细节,更不用说难以置信的丑陋了。它没有你通常期望的JS的词汇行为。Add
a.baz=99
就在a()的正上方代码>。现在,如果我们在b()中尝试arguments.callee.caller.baz,我们将得到99。很好-让我们使用参数.callee.caller.foo
!我们没有定义。好吧,发生的事情是,caller
指的是函数对象,而\uuuuuuuuuuuuuuu
指的是变量对象(它是foo
=2附加的)代码>。现在,如果我们在b()中尝试arguments.callee.caller.baz,我们将得到99。很好-让我们使用参数.callee.caller.foo
!我们没有定义。好吧,事实是,调用者
指的是函数对象,\uuuuuu调用者
指的是变量对象(它与foo
=2相连)。特殊情况很有趣,有助于理解。(如果你的c在全局范围内,那么它的b
是未定义的。如果它在b内,那么我可能打算这样做-我可能正在定义一个奇怪的递归函数,需要在其中检查上一次递归的值。或者我可能想选择将变量定义到哪个范围。或者打印堆栈跟踪。)特殊情况很有趣,有助于理解。(如果你的c在全局范围内,那么它的b
是未定义的。如果它在b内,那么我可能打算这样做-我可能正在定义一个奇怪的递归函数,需要在其中检查上一次递归的值。或者我可能想选择将变量定义到哪个范围。或者打印堆栈跟踪。)我无法使用此
访问浏览器本身的全局上下文。您所描述的安全缺陷似乎很容易通过从不在全局作用域上设置\uuuuu调用者\uuuuu
来解决,因此从不提供对特权代码的引用。所以我没有发现问题,这导致我问这个问题。你已经把词法范围和调用堆栈弄糊涂了<代码>\uuuu调用者\uuuu
将通过调用堆栈后退;它不需要到达与全局范围相对应的激活对象。我的错。“…当它提供对特权代码的引用时,从不设置它”。如果沙箱化非常简单,那么它并不是一场安全灾难。或者是因为某种原因,它是非平凡的?在chrome和非chrome之间的一种情况下,它可能是可以实现的,但它排除了JavaScript代码中存在另一个安全边界的可能性。根据bug的说法,“即使进行访问检查,我们也认为风险太大”。这一切都发生在Firefox之前。顺便说一句,在ECMAScript第五版的“严格模式”中,甚至参数都没有了;一般认为,除调试器外,此功能在代码中没有合法用途 — Firebug现在为我们提供了一种更好的方法。还有另一个理由可以禁止调用方,正如列表中提到的:拥有属性意味着y