Я впервые написал дополнение для 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 точно показывает, как использовать объявленные функции в некоторых примерах.