这是纯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
谢谢!
答案 0 :(得分:2)
这是不安全的。以下构造将从沙箱中获取全局window
对象:
(function(){return this;})()
此时,您可以从中提取任何内容,包括document
等好东西。
帽子提示T.J.克劳德在https://stackoverflow.com/a/2673780/149341上回答了他对这个漏洞的描述。