Потенциально уязвимость при использовании setInterval в аддоне Firefox?

Я впервые написал дополнение для Firefox, и оно было рассмотрено и принято несколько месяцев назад. Это дополнение часто вызывает сторонний API. Тем временем он был снова пересмотрен, и теперь критикуется то, как он вызывает setInterval:

setInterval вызывается потенциально опасным образом. Во избежание уязвимостей функции setTimeout и setInterval следует вызывать только с функциональными выражениями в качестве первого аргумента. Переменные, ссылающиеся на имена функций, допустимы, но не рекомендуются, поскольку они не поддаются статической проверке исходного кода.

Вот некоторые сведения об «архитектуре» моего аддона. Он использует глобальный объект, который представляет собой не что иное, как пространство имен:

if ( 'undefined' == typeof myPlugin ) {
    var myPlugin = {
        //settings
        settings : {},

        intervalID : null,

        //called once on window.addEventlistener( 'load' )
        init : function() {
            //load settings
            //load remote data from cache (file)

        },

        //get the data from the API
        getRemoteData : function() {
            // XMLHttpRequest to the API
            // retreve data (application/json)
            // write it to a cache file
        }
    }

    //start 
    window.addEventListener(
    'load',
    function load( event ) {
        window.removeEventListener( 'load', load, false ); needed
        myPlugin.init();
    },
    false
);
}

Так что это может быть не лучшая практика, но я продолжаю учиться. Сам интервал вызывается внутри метода init() следующим образом:

myPlugin.intervalID = window.setInterval(
    myPlugin.getRemoteData,
    myPlugin.settings.updateMinInterval * 1000 //milliseconds!
);

Есть еще один момент, задающий интервал: наблюдатель за настройками (предпочтениями) очищает текущий интервал и устанавливает его точно так же, как указано выше, когда происходит изменение настройки updateMinInterval.

Когда я получаю это правильно, решение с использованием «функциональных выражений» должно выглядеть так:

myPlugin.intervalID = window.setInterval(
    function() {
        myPlugin.getRemoteData();
    },
    myPlugin.settings.updateMinInterval * 1000 //milliseconds!
);

Я прав?

Каков возможный сценарий «атаки» на этот код, который я до сих пор упускал из виду?

Должны ли setInterval и setTimeout в основном использоваться в надстройках Firefox иначе, чем в «обычных» javascript-интерфейсах? Поскольку документация setInterval точно показывает, как использовать объявленные функции в некоторых примерах.


person David    schedule 14.03.2013    source источник


Ответы (1)


Я прав?

Да, хотя я полагаю, что вы уже попробовали это и нашли, что это работает.

Что касается того, почему вас просят изменить код, это связано с частью предупреждающего сообщения, в которой говорится: «Переменные, ссылающиеся на имена функций, допустимы, но устарели, поскольку они не поддаются статической проверке источника».

Это означает, что если вы не будете следовать рекомендуемому шаблону для первого параметра, невозможно автоматически вычислить результат выполнения вызова setInterval.

Поскольку setInterval подвержен тем же угрозам безопасности, что и eval(), важно убедиться, что вызов безопасен, особенно в привилегированном коде, таком как надстройка, поэтому это предупреждение служит красным флажком для надстройки. рецензенту, чтобы убедиться, что он тщательно оценивает безопасность этой строки кода.

Ваш первоначальный код должен быть принят и не вызывать проблем с безопасностью, но рецензент дополнения будет признателен за то, что у него будет на один красный флажок меньше.

Учитывая, что возможность автоматически определять результат выполнения JavaScript полезна для оптимизации производительности, а также для автоматических проверок безопасности, я бы поспорил, что функциональное выражение также будет выполняться быстрее.

person Luckyrat    schedule 08.04.2013