在Javascript中围绕Function()创建沙箱

FRD*_*FRD 9 javascript scope sandbox

我可以将字符串生成的函数(使用Function构造函数)的访问权限限制为父/全局范围吗?

例如:以下代码按原样打印为false,因为该函数正在窗口中存储/修改变量a.

window.a = 4;
Function("a=3;")()
console.log(a === 4);
Run Code Online (Sandbox Code Playgroud)

我可以限制对窗口/父作用域的访问并使其打印为"true"吗?

Fel*_*ing 9

这是一个额外的想法,可以与Esailija的提议一起非常强大(参见他对讨论的回答的评论).

您可以创建虚拟iframe并使用其Function功能.使用它创建的函数默认只能访问iframe的范围,尽管它仍然可以突破它.幸运的是,就像Esailija建议的那样,很容易防止这种情况发生.

我可以想象这个函数是这样的:

function sandboxed(code) {
    var frame = document.createElement('iframe');
    document.body.appendChild(frame);

    var F = frame.contentWindow.Function,
        args = Object.keys(frame.contentWindow).join();

    document.body.removeChild(frame);

    return F(args, code)();
}
Run Code Online (Sandbox Code Playgroud)

DEMO

您可以选择预先'use strict';添加代码.


这至少在Chrome中有效.以这种方式创建的函数是否可以访问iframe的全局范围,或者页面的全局范围可以通过以下方式轻松测试:

(function() {
    var frame = document.createElement('iframe');
    document.body.appendChild(frame);
    var same = window === frame.contentWindow.Function('return window;')();
    alert(same ? ':(' : ':)');
    document.body.removeChild(frame);
}());
Run Code Online (Sandbox Code Playgroud)


Esa*_*ija 6

我不这么认为.您可以在参数中命名要保护的全局变量,以便它们遮蔽它们:

window.a = 4;
Function("a", "a=3;")()
console.log(a === 4);
Run Code Online (Sandbox Code Playgroud)

但无论你尝试什么,这个功能都可以访问全球......这就是为什么它被称为全局.

根据您要做的事情,还有其他解决方法,例如网络工作者......以及一如既往地隐藏的iframe黑客攻击.