不要在标题上评判我,我知道eval是邪恶的,但我有理由这样做,而且会非常有限.事情是这样的:我想创建一个安全的空间,我可以运行特定的(和可信的)代码,并检索结果(如果它符合我的预期).出于安全原因,我想将其从所有其他范围中删除(这个空间被要求提供结果,并且不应该自己将任何内容导出到周围的范围).
我找到了一个似乎有效的解决方案,也可以为执行添加上下文,但我不确定它是否有效,或者是否存在此系统中的安全漏洞.你能告诉我它是否有问题吗?
它实际上创建了与全局变量同名的本地变量,以防止访问它们.它还剥离了功能(我将添加功能以保留我想要保留的功能).该函数被声明为最接近全局变量,以避免可见性更高的局部范围(计划删除这些特定局部变量的参数).
function contextNoScope(root, context) {
//I had to pass window as parameter for it to work properly
for(var key in root){
if(key != '0' && key != 'window'){
eval('var ' + key + '=undefined;');
}
}
var window = undefined;
var root = undefined; //root has to be forbidden too
return function() {
this.eval = function(str){ return eval(str); };
return this;
}.call(context);
}
Run Code Online (Sandbox Code Playgroud)
用法:
(function(root){
function contextNoScope(root, context) {
//...same as previous
}
var context = { x: …Run Code Online (Sandbox Code Playgroud)