为了有一个能够在浏览器中运行任意javascript代码的接口,而没有像典型的妈妈玩笑那么大的安全漏洞,Esailija建议使用Web Workers.它们在半沙盒环境中运行(没有DOM访问并且已经在浏览器中)并且可以被杀死,因此用户无法将它们置于无限循环中.
以下是他提出的例子:http://tuohiniemi.fi/~runeli/petka/workertest.html(打开你的控制台)
jsfiddle(仅限谷歌浏览器)
现在,这似乎是一个很好的解决方案; 然而,它是完整的(或接近完整的)吗?有什么明显缺失的吗?
整个事情(因为它连接到机器人)可以在github上找到:worker,evaluationator
主要:
workercode = "worker.js";
function makeWorkerExecuteSomeCode( code, callback ) {
var timeout;
code = code + "";
var worker = new Worker( workercode );
worker.addEventListener( "message", function(event) {
clearTimeout(timeout);
callback( event.data );
});
worker.postMessage({
code: code
});
timeout = window.setTimeout( function() {
callback( "Maximum execution time exceeded" );
worker.terminate();
}, 1000 );
}
makeWorkerExecuteSomeCode( '5 + 5', function(answer){
console.log( answer ); …Run Code Online (Sandbox Code Playgroud) 网络工作者是否减轻或加剧了JavaScript和浏览器环境中的任何已知安全问题?
我有一个用户提交的不受信任的代码,我需要在浏览器的沙盒环境中执行它。
有人告诉我,Web-Workers不能为此提供足够的安全性,因此最好使用Sandbxed iframe。这一页:
https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet#Web_Workers
还说工人不适合不受信任的代码。
但是,如果我从Blob创建一个worker,则其url甚至具有不同的协议(blob://)。在这种情况下,是否将单独的来源策略应用于工作者代码?
如果还有其他原因,为什么(默认情况下)为什么与沙盒iframe(访问IndexedDB等)相比,对工作人员的限制较少(是否有机会以某种方式设置工作人员,以便对其进行足够的限制,或者应该我还是要使用沙盒iframe吗?