1

我第一次写了一个 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 插件中使用,然后在 »normal« 前端 javascripts 中使用?因为setInterval的文档在某些示例中准确地显示了使用声明函数的方式。

4

1 回答 1

2

我对吗?

是的,虽然我想现在你已经尝试过了,发现它有效。

至于为什么要求您更改代码,这是因为警告消息的一部分说“引用函数名称的变量是可以接受的,但不推荐使用,因为它们不适合静态源代码验证”。

这意味着除非您遵循第一个参数的推荐模式,否则不可能自动计算执行 setInterval 调用的结果。

由于 setInterval 容易受到与 eval() 相同类型的安全风险的影响,因此检查调用是否安全非常重要,在附加组件等特权代码中更是如此,因此此警告可作为附加组件的危险信号-审阅者以确保他们仔细评估这行代码的安全性。

您的初始代码应该被接受并且不会导致安全问题,但附加审阅者会喜欢少考虑一个危险信号。

鉴于自动确定执行 JavaScript 的结果的能力对于性能优化以及自动安全检查很有用,我敢打赌,函数表达式也将执行得更快。

于 2013-04-08T20:40:37.250 回答