Semi-Sandboxing Javascript auswerten

Hintergrund: Ich arbeite an einem Framework / einer Bibliothek, die für eine bestimmte Site in Abstimmung mit greasemonkey / userscripts verwendet werden soll. Dieses Framework / diese Bibliothek ermöglicht die Unterstützung von Addons. Die Art und Weise, wie es funktioniert, ist ein Addon-Register, in dem die Bibliothek die erforderlichen Seiten, Ressourcen, Ectera und die Bibliothek auflistet und wartet, bis alle Kriterien erfüllt sind, um das Addon aufzurufenload() Funktion.

Die Angelegenheit: Ich möchte, dass Addon-Entwickler in dieser Auflistung der 'erforderlichen Inhalte' Javascript (als Zeichenfolge) angeben können, das als 'erforderliche Ressource' ausgewertet werden soll. Zum Beispiel'document.getElementById("banana")'. Was ich tun möchte, ist die Halb-Sandbox-Evaluierung der 'erforderlichen Ressource', damit die Evaluierung auf die Fenster- und DOM-Objekte zugreifen kann, diese jedoch nicht direkt ändern kann. Ich möchte auch eval und evalJS vom Sandkasten aus unzugänglich machen.


Beispiele:

document.getElementById("banana") -> gültigdocument.getElementById("apple).id = "orange" -> ungültigwindow.grape -> gültigwindow.grape = 'potato' -> ungültig(someObj.applesCount > 0 ? 'some' : 'none') -> gültig


Was ich bisher habe:

function safeEval(input) {

    // Remove eval and evalJS from the window:
    var e = [window.eval, window.evalJS], a;
    window.eval = function(){};
    window.evalJS = function(){};

    try {

        /* More sanition needed before being passed to eval */

        // Eval the input, stuffed into an annonomous function
        // so the code to be evalued can not access the stored
        // eval functions:
        a = (e[0])("(function(){return "+input+"}())");
    } catch(ex){}

    // Return eval and evalJS to the window:
    window.eval = e[0];
    window.evalJS = e[1];

    // Return the eval'd result
    return a;
}


Anmerkungen:
Dies ist ein Greasemonkey / Userscript. Ich habe keinen direkten Zugriff, um die Website zu ändern, oder es ist Javascript.
Die Eingabe fürsafeEval() Dies kann ein beliebiges gültiges Javascript sein, sei es eine DOM-Abfrage oder einfache Auswertungen, solange das Fensterobjekt oder DOM nicht geändert wird.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage