Справочная информация:
Я запускаю изолированную рамку iframe, которая имеет только разрешение "allow-scripts". В песочнице загружается скрипт с пользовательским js, предоставленным пользователем. Теперь я хочу управлять доступом к глобальным функциям / объектам, таким как XMLHttpRequest. В настоящее время я достигаю этого с помощью следующего кода:
const CLEARED_WINDOW_SCOPE= {};
const scope = { /* Here goes the globals the script should have access too */};
const propertyNames = Object.getOwnPropertyNames(window);
for(let property of propertyNames){
CLEARED_WINDOW_SCOPE[property] = undefined;
}
with(CLEARED_WINDOW_SCOPE){
with(scope){
(function (window, self, frames, globalThis){
${scriptContent}
}).call(scope, scope, scope, scope, scope);
}
}
Сценарий выполняет следующие действия:
- Создание объекта со всеми именами свойств окна, для которых установлено значение undefined
- Создать объект со всеми свойствами, к которым у пользователя тоже должен быть доступ
- Оберните код пользователя двумя операторами
with
, первый очищает все глобальные переменные, второй предоставляет доступ к определенным - Оберните пользовательский код с помощью функция, которая вызывается с
scope
как this
значение
Пока все работает отлично, как и ожидалось.
Проблема:
Основная проблема, с которой я столкнулся сейчас, заключается в том, что когда пользователь определяет такую функцию:
function aFunction(){
console.log(this);
}
Он получает доступ к обычному объекту окна, поскольку значение по умолчанию this
в функции - это window.
Вопрос:
Возможно ли как-то изменить значение функции this
по умолчанию на значение this
окружающей области видимости. Поскольку пользователь создает скрипт, я не могу обернуть все вызовы функций с помощью aFunction.bind(scope)
. Или есть какое-либо другое значение, предотвращающее доступ к объекту глобального окна?