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

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

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



Примеры: ->

document.getElementById("banana") действительный ->document.getElementById("apple).id = "orange" неверный ->window.grape действительный ->window.grape = 'potato' неверный ->(someObj.applesCount > 0 ? 'some' : 'none') действительный



Что у меня так далеко:

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



Заметки:

Это Greasemonkey / userscript. У меня нет прямого доступа, чтобы изменить сайт, илис javascript.

Вход дляsafeEval() это может быть любой допустимый JavaScript, будь то запрос DOM или простые вычисления, если он не изменяет объект окна или DOM.

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

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