JavaScript沙盒:隐藏给定范围内的全局变量

Gre*_*Cat 4 javascript closures scope isolation

我想创建一个HTML + JS环境,用户可以在其中输入和运行任意JavaScript代码,这些代码将在给定的jail对象的上下文中执行.我已经建立了一个游乐场来说明我到目前为止的情况.

这个工作做得不错:

  • 基本评估工作:
    • 输入: 2 + 2
    • 输出: 4
  • this 返回jail对象
    • 输入: this
    • 输出: [object Object]
  • this.hello() 运行预期的方法
    • 输入: this.hello()
    • 输出: hello world!
  • 用户可以设置自己的功能并在以后执行:
    • 输入: this.foo = function() { return 42; }
    • 输出: function () { return 42; }
    • 输入: this.foo()
    • 输出继电器: 42
  • 试图访问一些我想要从jail上下文"隐藏"的对象失败:
    • 输入: hidden
    • 输出: ReferenceError: hidden is not defined

但是,它完全无法隐藏全局可访问的属性,例如windowdocument用户:

  • 输入: window
  • 当前输出: [object Window]
  • 期望的输出: ReferenceError: window is not defined

到目前为止,我提出的最佳解决方案是填充我能想到的所有全局变量undefinednullJail对象声明中的正确变量,如更新版本所示.这样他们似乎永远在监狱范围内丢失,用户将无法访问它们.我的问题:

  • 我对吗?这样安全吗?
  • 有没有更好的方法,即在某些范围内真正取消定义全局内容而不是用一些占位符值重写它们?

Ry-*_*Ry- 5

如果它是客户端,您可以保证现代浏览器,请使用Web worker ; 它们更安全,你也可以阻止无限循环占用主线程,并通过调用实现超时Worker#terminate.

为每次执行启动一个新工作者:

var worker = new Worker('path/to/evaluator.js');
Run Code Online (Sandbox Code Playgroud)

接收来自工作人员的消息:

worker.onmessage = function (e) {
    console.log(e.data);
};
Run Code Online (Sandbox Code Playgroud)

发送代码执行:

worker.postMessage(someCode);
Run Code Online (Sandbox Code Playgroud)

在工人中,听:

onmessage = function (e) {
    postMessage(eval(e.data));
};
Run Code Online (Sandbox Code Playgroud)

并且确保terminate在收到消息后也要打电话,因为工作人员可以postMessage自己打电话.(你可以预防,但实在没有意义.)

Web工作者无法访问主执行上下文中的任何内容,它们在另一个线程上运行,并且它们由浏览器实现,因此它们比典型的delete-dangerous-things沙箱更安全.

他们这样做,不过,有机会获得XMLHttpRequest; 看看是否可以在浏览器中运行沙盒JavaScript?对于其他方法,如果这是一个问题.