JavaScript: небезопасная изоляция скриптов

Я смотрю многие начинают задумываться об изоляции JavaScript, подключаемых в контекст страницы. Например, вы подключаете какую-то чужую библиотеку (виджет) с чужого сайта, но не очень-то ему доверяете.

Сейчас считается, что безопасным методом является что-то вроде:

(function (window, alert) {
    alert('Функция «alert» изолирована и доступ к методу из «window» теперь получить нельзя');
})({}, function (){})

Это не правильно.

Такой вызов вас ни от чего не защищает, более того, можно запросто «восстановить справедливость» и получить изнутри такого скрипта доступ к оригинальному window:

<script>
(function(window, alert){
    alert('Пичалька');

    (function(){ with(this) {
        alert('Уже всё хорошо'); 
    }}).call(null);
})({}, function(){})
</script>

В общем случае идея такой изоляции — плохая. Я не видел ни одного удачного примера подобной изоляции и не смог придумать его самостоятельно.

Комментарии 13

Алексей № 1
Частное решение изоляции в JavaScript реализовано в Gecko 1.9.x в виде модулей: https://developer.mozilla.org/en/JavaScrip … ules/Using
В модуле недоступно окно, функция 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. В принципе механизм ограничений схож с модулями, но в данном случае мы можем указать исходный код для выполнения.
Минус, как всегда, зависимость от платформы.
Евгений Степанищев (bolknote.ru) автор № 2
Sandboxing в IFRAME есть в HTML5, только его мало кто поддерживает пока. У меня есть исследование на эту тему, надо будет систематизировать и опубликовать.
Dima № 3
У Facebook была (3 года назазд смотрел) оригинальная можно так сказать изоляция для приложений построенных на его платформе.
Азат Разетдинов (razetdinov.ya.ru) № 4
Евгений Степанищев (bolknote.ru) автор № 5
Первое я не понял от чего оно вообще спасает:

Работает. А вроде создал по всем правилам. Второе смотрю.
Евгений Степанищев (bolknote.ru) автор № 6
Правильно ли я понимаю, что второе имеет какую-то серверную часть на Java, которая как-то обрабатывает JavaScript?
Алексей № 7
Вопрос в следующем — стоит ли использовать одни чужие библиотеки для ограничения возможностей других чужих библиотек?
Евгений Степанищев (bolknote.ru) автор № 13
Комментарий для Игорь:

У вас код просто не работает. Вы передаёте вместо alert null (так как не указываете параметры вызова) и JS не выполняет код — выдаёт ошибку вместо первого вызова alert.