eval函数是一种动态生成代码的强大而简单的方法,那么有什么警告呢?
有没有可能到沙盒用户提交的Javascript通过覆盖各种功能,例如alert,window.location和eval?
我不是在寻找一个完美的解决方案.我敢肯定有些人仍然会找到一种方法来重新排列div来拼出脏话或恶意的东西,但如果我可以100%可靠地禁用页面重定向,我会非常高兴.
我在Chrome中试过,并做了类似的事情
context={}; //use this to prevent `this` from being `window`
context.f=function(){
var window=null,location=null,eval=function(){};
console.log(window); //also the other two
};
context.f();
Run Code Online (Sandbox Code Playgroud)
似乎很有希望 如果我console用用户提交的代码替换该行(检查平衡),这是一个荒谬的坏主意还是一个有点不好的主意?在Chrome上,我仍然可以通过this功能和重新定义来解决问题,但这对我来说是可以接受的.
想象一下我想要不断调用用户提供的Javascript代码的场景,如下例所示,其中getUserResult是某个用户(非我自己)编写的函数:
for (var i = 0; i < N; ++i) {
var x = getUserResult(currentState);
updateState(currentState, x);
}
Run Code Online (Sandbox Code Playgroud)
如何在浏览器和/或Node.js中执行这种代码,没有任何安全风险?
更一般地说,如何执行不允许修改甚至读取当前网页或任何其他全局状态的Javascript函数?是否有类似浏览器内的"JS虚拟机"?
JSFiddle如何确保您不能运行任何恶意代码(至少它可能会破坏您的登录名,在页面生命周期内运行机器人,如果不做更糟糕的事情)?或者它根本不确定?