2 Stimmen

Bestimmte Eigenschaften eines Objekts vor Skripten in Iframes ausblenden

Ich habe ein Fenster, das einen iframe enthält (gleicher Ursprung), so dass Skripte aus diesem iframe auf die Attribute des oberen Fensters zugreifen können, indem sie einfach auf die top.foo . Ich möchte Zugang zu einigen dieser Attribute gewähren und andere über eine schwarze Liste ausblenden.

Dies ist mein bisheriger Stand:

(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;
        },
    });
})();

Die Grundidee dahinter ist, dass f.caller instanceof Function sollte Aufrufe von fremden Fensterobjekten erkennen, da window1.Function !== window2.Function .

Aber diese funktioniert nicht wenn die Accessoren von Top-Level-Code aufgerufen werden, wobei f.caller === null . Gibt es Lösungen?

0voto

user123444555621 Punkte 139356

Für den Moment habe ich mich für den folgenden Ansatz entschieden, da ich nicht glaube, dass es möglich ist, Top-Level-Aufrufe zu erkennen:

/**
* 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;
                }
            });
        }
    });
};

Wenn jemandem eine bessere Lösung einfällt, lassen Sie es mich bitte wissen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X