JavaScript沙箱:从给定范围隐藏全局变量

JavaScript沙箱:从给定范围隐藏全局变量,javascript,scope,closures,isolation,Javascript,Scope,Closures,Isolation,我想创建一个HTML+JS环境,用户可以在其中输入并运行任意JavaScript代码,这些代码将在给定对象的上下文中执行。我已经建立了一个新的组织 这一个做得相当不错: 基本评估工作: 输入:2+2 输出:4 此返回对象 输入:此 输出:[object object] this.hello()运行预期的方法 输入:this.hello() 输出:helloworld 用户可以设置自己的功能并在以后执行: 输入:this.foo=function(){return 42;} 输出:

我想创建一个HTML+JS环境,用户可以在其中输入并运行任意JavaScript代码,这些代码将在给定对象的上下文中执行。我已经建立了一个新的组织

这一个做得相当不错:

  • 基本评估工作:
    • 输入:
      2+2
    • 输出:
      4
  • 返回对象
    • 输入:
    • 输出:
      [object object]
  • this.hello()
    运行预期的方法
    • 输入:
      this.hello()
    • 输出:
      helloworld
  • 用户可以设置自己的功能并在以后执行:
    • 输入:
      this.foo=function(){return 42;}
    • 输出:
      function(){return 42;}
    • 输入:
      this.foo()
    • 输出:
      42
  • 尝试访问某个我想对其上下文保持“隐藏”状态的对象失败:
    • 输入:
      隐藏
    • 输出:
      ReferenceError:未定义隐藏
但是,它完全无法隐藏全局可访问的属性,例如用户的
窗口
文档

  • 输入:
    窗口
  • 当前输出:
    [对象窗口]
  • 所需输出:
    ReferenceError:未定义窗口
到目前为止,我提出的最好的解决方案是在Jail对象声明中用
undefined
null
填充我能想到的所有全局变量,如下所示。这样一来,它们似乎永远消失在监狱的范围内,用户将无法访问它们。我的问题是:

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

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

为每次执行启动一个新的辅助进程:

var worker = new Worker('path/to/evaluator.js');
从工作人员接收消息:

worker.onmessage = function (e) {
    console.log(e.data);
};
发送要执行的代码:

worker.postMessage(someCode);
在worker中,请听:

onmessage = function (e) {
    postMessage(eval(e.data));
};
并确保在收到消息后调用
terminate
,因为工作人员可以调用
postMessage
本身。(你可以防止这种情况发生,但实际上没有意义。)

Web工作人员无法访问主执行上下文中的任何内容,他们在另一个线程上运行,并且由浏览器实现,因此他们比典型的删除危险物品沙箱安全得多


但是,它们确实可以访问
XMLHttpRequest
;如果这是一个问题,请查看其他方法。

这就是我一直在寻找的方法!