JavaScript: небезопасная изоляция скриптов
Я смотрю многие начинают задумываться об изоляции JavaScript, подключаемых в контекст страницы. Например, вы подключаете
Сейчас считается, что безопасным методом является
(function (window, alert) {
alert('Функция «alert» изолирована и доступ к методу из «window» теперь получить нельзя');
})({}, function (){})Это не правильно.
Такой вызов вас ни от чего не защищает, более того, можно запросто «восстановить справедливость» и получить изнутри такого скрипта доступ к оригинальному window:
<script>
(function(window, alert){
alert('Пичалька');
(function(){ with(this) {
alert('Уже всё хорошо');
}}).call(null);
})({}, function(){})
</script>В общем случае идея такой изоляции — плохая. Я не видел ни одного удачного примера подобной изоляции и не смог придумать его самостоятельно.
Комментарии 13
В модуле недоступно окно, функция alert(), и наверняка многое другое…
Минусы:
— зависимость от платформы (браузера);
— цитата: «A string of the URL of the script to be loaded. The URL must point to a file on the disk, possibly in a JAR.»
Еще одна мысль которая приходит в голову — это Sandbox в том же самом Gecko. В принципе механизм ограничений схож с модулями, но в данном случае мы можем указать исходный код для выполнения.
Минус, как всегда, зависимость от платформы.
Работает. А вроде создал по всем правилам. Второе смотрю.
В случае виджетов выбора нет.
alert('Пичалька');
(function(){ with(this) {
alert('Уже всё хорошо');
}}).call(null);
})()
alert('Пичалька');
(function(){ with(this) {
alert('Опять Пичалька');
}}).call(null);
})()
У вас код просто не работает. Вы передаёте вместо alert null (так как не указываете параметры вызова) и JS не выполняет код — выдаёт ошибку вместо первого вызова alert.