2013-03-14 19 views
1

我已經寫了一個Firefox插件第一次,它在幾個月前被審查和接受。這個插件經常會調用第三方API。與此同時,它再次審查,現在它稱爲setInterval的方式被批評:Firefox插件中使用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設置。

當我得到this權,使用»函數表達式的解決方案«應該是這樣的:

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

我說得對不對?

什麼是「攻擊」此代碼的可能情況,至今我忽略了?

應該setIntervalsetTimeout基本上以另一種方式在Firefox插件中使用,然後在»normal«前端javascripts?因爲setInterval的文檔正好顯示了在某些示例中使用聲明函數的方式。

回答

2

對嗎?

是的,雖然我想現在你已經嘗試過,發現它的工作原理。

至於爲什麼你被要求更改代碼,這是因爲相關的警告消息說「變量引用函數名是可以接受的,但不贊成他們不適合靜態源驗證」的一部分。

這意味着除非您遵循第一個參數的推薦模式,否則不可能自動計算執行setInterval調用的結果。

由於setInterval容易受到與eval()相同類型的安全風險,因此檢查調用是否安全非常重要,甚至在特權代碼(如加載項)中非常重要,因此此警告充當紅色標誌給附加審閱者以確保他們仔細評估這行代碼的安全性。

您的初始代碼應該被接受並且不會引起任何安全問題,但是附加評論者會喜歡少一個紅旗來考慮。

鑑於自動確定執行JavaScript結果的能力對於性能優化以及自動安全檢查非常有用,我希望函數表達式能夠更快地執行。