Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么呼叫者不安全?_Javascript - Fatal编程技术网

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