JavaScript沙箱:从给定范围隐藏全局变量
我想创建一个HTML+JS环境,用户可以在其中输入并运行任意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;} 输出:
- 基本评估工作:
- 输入:
2+2
- 输出:
4
- 输入:
返回对象此
- 输入:
此
- 输出:
[object object]
- 输入:
运行预期的方法this.hello()
- 输入:
this.hello()
- 输出:
helloworld代码>
- 输入:
- 用户可以设置自己的功能并在以后执行:
- 输入:
this.foo=function(){return 42;}
- 输出:
function(){return 42;}
- 输入:
this.foo()
- 输出:
42
- 输入:
- 尝试访问某个我想对其上下文保持“隐藏”状态的对象失败:
- 输入:
隐藏
- 输出:
ReferenceError:未定义隐藏
- 输入:
窗口
或文档
:
- 输入:
窗口
- 当前输出:
[对象窗口]
- 所需输出:
ReferenceError:未定义窗口
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
;如果这是一个问题,请查看其他方法。这就是我一直在寻找的方法!