Semi-sandboxing JavaScript eval

tło: Pracuję nad frameworkiem / biblioteką, która ma być używana w konkretnej witrynie w koordynacji z greasemonkey / userscripts. Ta struktura / biblioteka pozwoli na obsługę dodatków. Sposób, w jaki będzie działał, to dodatek rejestrujący się z listą wymaganych bibliotek, zasobów, ectera i biblioteka poczeka na spełnienie wszystkich kryteriów, aby wywołać addonload() funkcjonować.

Problem: W tej liście „wymaganych rzeczy” chcę, aby devony addon mogły określić javascript (jako ciąg znaków), który ma być oceniany jako „wymagany zasób”. Na przykład'document.getElementById("banana")'. To, co chcę zrobić, to pół-sandbox oceny „wymaganego zasobu”, aby ocena mogła uzyskać dostęp do obiektów okna i DOM, ale nie jest w stanie ich bezpośrednio zmienić. Chciałbym też, aby eval i evalJS były niedostępne z piaskownicy.


Przykłady:

document.getElementById("banana") -> ważnedocument.getElementById("apple).id = "orange" -> nieprawidłowywindow.grape -> ważnewindow.grape = 'potato' -> nieprawidłowy(someObj.applesCount > 0 ? 'some' : 'none') -> ważne


Co mam do tej pory:

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;
}


Uwagi:
To jest Greasemonkey / usercript. Nie mam bezpośredniego dostępu do zmiany strony lub javascript.
Wejście dlasafeEval() może to być dowolny poprawny javascript, czy to zapytanie DOM, czy proste oceny, o ile nie zmienia to obiektu okna ani DOM.

questionAnswers(4)

yourAnswerToTheQuestion