Я работал над упрощенной js-песочницей, чтобы пользователи могли создавать апплеты для моего сайта. Хотя я все еще сталкиваюсь с некоторыми проблемами, связанными с разрешением доступа к DOM (parentNode просто не позволяет мне обеспечивать безопасность = /), мой подход состоял в том, чтобы просто переопределить объект окна с некоторыми его полезными / безвредными членами, а затем eval () для пользователя код с этим переопределенным окном в качестве области по умолчанию.
Мой "основной" код выглядит следующим образом ... (я не показываю его полностью;)
function Sandbox(parent){
this.scope = {
window: {
alert: function(str){
alert("Overriden Alert: " + str);
},
prompt: function(message, defaultValue){
return prompt("Overriden Prompt:" + message, defaultValue);
},
document: null,
.
.
.
.
}
};
this.execute = function(codestring){
// here some code sanitizing, please
with (this.scope) {
with (window) {
eval(codestring);
}
}
};
}
Итак, я могу создать экземпляр Sandbox и использовать его execute () для запуска кода. Кроме того, все новые объявленные переменные в коде eval'd будут в конечном счете связаны с областью выполнения (), поэтому не будет конфликтующих имен или работы с существующим кодом.
Хотя глобальные объекты все еще будут доступны, те, которые должны оставаться неизвестными для изолированного кода, должны быть определены как прокси в объекте Sandbox :: scope.
Надеюсь, это работает для вас.