Чистая Песочница Javascript
Это возможное решение для чистой песочницы 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
Я предложил это на старом посте: /questions/17450801/est-li-sposob-zaklyuchit-v-tyurmu-v-javascript-tak-chto-dom-ne-viden/17450810#17450810
Спасибо!
1 ответ
Это небезопасно. Следующая конструкция получит глобальный window
объект из вашей песочницы:
(function(){return this;})()
В этот момент вы можете извлечь из него все, что захотите, включая такие как document
,
Шляпа для TJ Crowder за ответ на /questions/17450801/est-li-sposob-zaklyuchit-v-tyurmu-v-javascript-tak-chto-dom-ne-viden/17450806#17450806 в котором он описал этот эксплойт.