Полу-песочница Javascript Eval

BackgroundЯ работаю над фреймворком / библиотекой, которая будет использоваться для конкретного сайта в координации с greasemonkey / userscripts. Эта структура / библиотека позволит поддержку дополнений. Он будет работать как регистр аддона с библиотекой, в которой перечислены требуемые страницы, ресурсы, ectera, и библиотека будет ожидать, пока все critera не будут выполнены, чтобы вызвать аддон.load() функция.

The Issue: В этом списке «необходимых материалов»; Я хочу, чтобы разработчики аддонов могли указывать javascript (в виде строки), который будет оцениваться как «требуемый ресурс». Например'document.getElementById("banana")', То, что я хочу сделать, - это полу-песочница для оценки «требуемого ресурса». таким образом, оценка может получить доступ к окну & amp; Объекты DOM, но не могут напрямую их изменять. Я также хотел бы сделать eval и evalJS недоступными из песочницы.


Examples:

document.getElementById("banana") -> valid document.getElementById("apple).id = "orange" -> invalid window.grape -> valid window.grape = 'potato' -> invalid (someObj.applesCount > 0 ? 'some' : 'none') -> valid


What I have so far:

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


Notes:
Это Greasemonkey / userscript. У меня нет прямого доступа для изменения сайта или его javascript.
Вход дляsafeEval() это может быть любой допустимый JavaScript, будь то запрос DOM или простые вычисления, если он не изменяет объект окна или DOM.

Ответы на вопрос(4)

Ваш ответ на вопрос