纯Javascript沙箱

时间:2012-07-16 22:53:25

标签: javascript sandbox trusted-vs-untrusted

这是纯javascript沙箱的可能解决方案吗? 我愿意执行不受信任的代码字符串,而无需访问DOM,窗口,此等,但允许用户访问Math,JSON和其他功能。 我在Chrome上测试了它。

更新: 我希望能够节省服务器用户定义的代码并使其可供其他用户使用。我正在寻找一种拒绝访问文档的方法,以使其安全。

function safe(code,args)
{
    if (!args)
        args=[];
    return (function(){
      for (i in window) 
        eval("var "+i+";");
      return function(){return eval(code);}.apply(0,args);
    })();
}



ff=function()
{
    return 3.14;
}

console.log(safe("this;"));//Number
console.log(safe("window;"));//undefined
console.log(safe("console;"));//undefined
console.log(safe("Math;"));//MathConstructor
console.log(safe("JSON;"));//JSON
console.log(safe("Element;"));//undefined
console.log(safe("document;"));//undefined
console.log(safe("Math.cos(arguments[0]);",[3.14]));//-0.9999987317275395
console.log(safe("arguments[0]();",[ff]));//3.14

我在旧帖子上提出了这个问题:https://stackoverflow.com/a/11513690/76081

谢谢!

1 个答案:

答案 0 :(得分:2)

这是不安全的。以下构造将从沙箱中获取全局window对象:

(function(){return this;})()

此时,您可以从中提取任何内容,包括document等好东西。

帽子提示T.J.克劳德在https://stackoverflow.com/a/2673780/149341上回答了他对这个漏洞的描述。