使周围的沙盒功能()在Javascript(Make sandbox around Function

2019-06-26 21:28发布

我可以限制一个字符串生成功能(使用功能的构造函数)父/全球范围的访问?

例如:下面的代码,因为它是,打印假的 ,因为该函数是存储/在窗口修改变量a。

window.a = 4;
Function("a=3;")()
console.log(a === 4);

我能限制访问窗口/父范围,并使其打印出“真”?

Answer 1:

下面是这可能是非常强大与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)();
}

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);
}());


Answer 2:

我不认为如此。 你能说出你想要保护的参数,使它们的影子他们的全局:

window.a = 4;
Function("a", "a=3;")()
console.log(a === 4);

但功能将有机会获得全球不管你是什么......这就是为什么它被称为全球。

根据什么你正在尝试做的,也有其他变通方法,如网络工作者......和往常一样, 隐藏的iframe黑客 。



Answer 3:

@ Esailija的答案是正确的。 此外,我会建议限制你必须摆在首位,以保护全局变量的数量。 放任何东西,你通常会放在在全局命名空间APP ,你控制范围:

var APP = (function() {
    return {
        a: 4
    };
}());

有没有办法完全限制访问全球范围内,但至少这种方式,你只需要保护一个对象: APP



文章来源: Make sandbox around Function() in Javascript