Gre*_*Cat 4 javascript closures scope isolation
我想创建一个HTML + JS环境,用户可以在其中输入和运行任意JavaScript代码,这些代码将在给定的jail对象的上下文中执行.我已经建立了一个游乐场来说明我到目前为止的情况.
这个工作做得不错:
2 + 24this 返回jail对象
this[object Object]this.hello() 运行预期的方法
this.hello()hello world!this.foo = function() { return 42; }function () { return 42; }this.foo()42hiddenReferenceError: hidden is not defined但是,它完全无法隐藏全局可访问的属性,例如window或document用户:
window[object Window]ReferenceError: window is not defined到目前为止,我提出的最佳解决方案是填充我能想到的所有全局变量undefined或nullJail对象声明中的正确变量,如更新版本所示.这样他们似乎永远在监狱范围内丢失,用户将无法访问它们.我的问题:
如果它是客户端,您可以保证现代浏览器,请使用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?对于其他方法,如果这是一个问题.
| 归档时间: |
|
| 查看次数: |
1279 次 |
| 最近记录: |