Как закрыть доступ к глобальному объекту window?
Есть скрипт. Возможно ли каким-нибудь способом сделать так, чтобы из этого скрипта не было доступа к объекту window?
|
Нет.
|
Цитата:
|
А так нельзя ?
(function(window) {
window = {};
window.a = 'aaaa'; //Это тот скрипт который не должен иметь доступа к window
})(window);
alert(window.a);
|
Цитата:
сайт site.ru <script> window.a = 'hello'; </script> <iframe src="anothersite.ru"></iframe> сайт anothersite.ru <script> alert( window.a ); // undefined <script> Цитата:
|
Цитата:
Цитата:
|
walik,
(function(window) {
window = {};
(function(){return this})().a = "mhahahaha, I'm badboy!";
b = 'Much easier way';
window.a = 'aaaa'; //Это тот скрипт который не должен иметь доступа к window
})(window);
alert([window.a, window.b]);
|
Обидно :) :) :)
|
function create_isolated_closure(func)
{
var global = (function(){return this;}).call(null);
var undefined;
// перекрываем абсолютно все что есть в global
var scope = {};
for(attr in global) {
scope[attr] = undefined;
}
delete scope.alert; // оставляем доступ к alert(), чтобы тестировать функции
with(scope)
return eval("(function () { return ("+func.toString()+"); })()");
}
function test()
{
alert(document);
alert(window);
}
test(); // обычный вызов, DOM доступен
var t = create_isolated_closure(test); // делаем изолированную копию функции
t.call({}); // вызов изолированной копии, DOM недоступен
|
По-прежнему
function create_isolated_closure(func)
{
var global = (function(){return this;}).call(null);
var undefined;
// перекрываем абсолютно все что есть в global
var scope = {};
for(attr in global) {
scope[attr] = undefined;
}
delete scope.alert; // оставляем доступ к alert(), чтобы тестировать функции
with(scope)
return eval("(function () {return ("+func.toString()+"); })()");
}
function test()
{
var w = (function(){return this})();
w.alert(['hacked', w.document]);
}
var t = create_isolated_closure(test); // делаем изолированную копию функции
t.call({}); // вызов изолированной копии, DOM недоступен
|
Да ... как раз сейчас и думаю, что с этим можно сделать.
|
В strict mode this должен по-умолчанию быть равен undefined. Только with там запрещён
"use strict";
alert( (function(){return this})() )
В хромиуме (и, вроде как, FF5) оно уже работает, но в Опере ещё нет.А ещё есть такая хитрость:
function create_isolated_closure(func)
{
var global = (function(){return this;}).call(null);
var undefined;
// перекрываем абсолютно все что есть в global
var scope = {};
for(attr in global) {
scope[attr] = undefined;
}
delete scope.alert; // оставляем доступ к alert(), чтобы тестировать функции
with(scope)
return eval("(function () { 'use strict'; return ("+func.toString()+"); })()");
}
function test()
{
var w1 = (eval || eval)("this"),
w2 = (function(){return this})();
alert([w1, w2]);
}
var t = create_isolated_closure(test); // делаем изолированную копию функции
t.call({}); // вызов изолированной копии, DOM недоступен
|
Да, strict mode интересная штуковина, не знал. Спасибо.
По примеру, в хроме помогает и this undefined, а вот в ff 3.6 всё отлично. |
| Часовой пояс GMT +3, время: 04:20. |