为了有一个能够在浏览器中运行任意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文件,读取另一个文件,其中可能包含需要eval() - ed的javascript片段.脚本片段应该符合javascript的严格子集,这限制了它们可以做什么以及它们可以更改哪些变量,但我想知道是否有某种方法可以通过阻止eval在全局范围内查看变量来强制执行此操作.类似于以下内容:
function safeEval( fragment )
{
var localVariable = g_Variable;
{
// do magic scoping here so that the eval fragment can see localVariable
// but not g_Variable or anything else outside function scope
eval( fragment );
}
}
Run Code Online (Sandbox Code Playgroud)
实际的代码不需要看起来像这样 - 我对任何和所有带闭包的奇怪技巧都是开放的等等.但我确实想知道这是否可能.
我真的想为用户提供一些脚本功能,同时不让它访问更强大的功能,比如改变DOM.也就是说,所有输入/输出都通过给定接口进行隧道传输.就像一种受限制的javacsript.
示例:如果checkanswer(func)
允许接口:
checkanswer( function (x,y)={
return x+y;
}
Run Code Online (Sandbox Code Playgroud)
但这些是不允许的:
alert(1)
document.write("hello world")
eval("alert()")
编辑:我想到的是一个使用javascript实现的简单语言,如http://stevehanov.ca/blog/index.php?id=92