Скрыть определенные свойства объекта из скриптов в iframes - PullRequest
2 голосов
/ 12 марта 2012

У меня есть окно, содержащее iframe (того же источника), поэтому скрипты из этого iframe могут обращаться к атрибутам верхнего окна, просто ссылаясь на top.foo.Я хочу предоставить доступ к некоторым из этих атрибутов и скрыть другие через черный список.

Это то, что я имею до сих пор:

(function(){
    var private = PrivateObject;
    Object.defineProperty(window, 'PrivateObject', {
        get: function getter() {
            if (!(getter.caller instanceof Function)) {
                throw 'You can\'t access PrivateObject from the iframe';
            }
            return private;
        },
        set: function setter(x) {
            if (!(setter.caller instanceof Function)) {
                throw 'You can\'t access PrivateObject from the iframe';
            }
            private = x;
        },
    });
})();

Основная идея заключается в том, что f.caller instanceof Functionдолжен обнаруживать вызовы от сторонних оконных объектов, поскольку window1.Function !== window2.Function.

Но этот не работает , если методы доступа вызываются из кода верхнего уровня, где f.caller === null.Любые решения?

1 Ответ

0 голосов
/ 14 марта 2012

На данный момент я решил использовать следующий подход, так как не думаю, что можно обнаружить вызовы верхнего уровня:

/**
* Hide objects from access from other window objects. For example, this may be used to prevent access to
* top.Ext from scipts inside iframes.
* <strong>Warning:</strong> This does not work reliably, since calls from top-level code cannot be detected.
* You may either <strong>allow all</strong> top-level access (from top and other windows), or <strong>disallow all</strong> top-level access.
* Also remember that objects may have indirect references.
* @param {Object} object The object whose properties shall be hidden
* @param {Array|String} properties A comma-separated list or an array of property names
* @param {Boolean} allowTopLevel <tt>true</tt> to allow access from top-level code. Defaults to <tt>false</tt>
*/
hideObjectsFromFrames = function (object, properties, allowTopLevel) {
    if (typeof properties == 'string') {
        properties = properties.split(/ *, */);
    }
    Ext.each(properties, function (property) {
        var orig = object[property];
        if (allowTopLevel) { // checking outside the accessors improves performance
            Object.defineProperty(object, property, {
                get: function g() {
                    if (g.caller && !(g.caller instanceof Function)) {
                        throw 'Security error. Attempt to access ' + property + ' from foreign window';
                    }
                    return orig;
                },
                set: function s(x) {
                    if (s.caller && !(s.caller instanceof Function)) {
                        throw 'Security error. Attempt to overwrite ' + property + ' from foreign window';
                    }
                    orig = x;
                }
            });
        } else {
            Object.defineProperty(object, property, {
                get: function g() {
                    if (!(g.caller instanceof Function)) {
                        throw 'Security error. Attempt to access ' + property + ' from foreign window';
                    }
                    return orig;
                },
                set: function s(x) {
                    if (!(s.caller instanceof Function)) {
                        throw 'Security error. Attempt to overwrite ' + property + ' from foreign window';
                    }
                    orig = x;
                }
            });
        }
    });
};

Если кто-нибудь придумает лучшее решение, пожалуйста, дайте мне знать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...