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!
);

私は正しいですか?

これまで見落としていた、このコードを「攻撃」する可能性のあるシナリオは何ですか?

基本的に、Firefox アドオンでは別の方法で使用し、»通常の« フロントエンド JavaScript では使用する必要がsetIntervalありますか? setIntervalsetTimeoutのドキュメントは、いくつかの例で宣言された関数を使用する方法を正確に示しているためです。

4

1 に答える 1

2

私は正しいですか?

はい、私はあなたがそれを試してみて、それが機能することを発見したと思います.

コードを変更するように求められる理由については、「関数名を参照する変数は受け入れられますが、静的ソース検証に対応していないため非推奨です」という警告メッセージの部分が原因です。

これは、最初のパラメーターの推奨パターンに従わない限り、setInterval 呼び出しの実行結果を自動的に計算できないことを意味します。

setInterval は eval() と同じ種類のセキュリティ リスクの影響を受けやすいため、呼び出しが安全であることを確認することが重要です。アドオンなどの特権コードではなおさらです。レビュアーにこのコード行の安全性を慎重に評価してもらいます。

最初のコードは受け入れられ、セキュリティ上の問題は発生しませんが、アドオンのレビュアーは、考慮すべき危険信号が 1 つ少なくなったことに感謝します。

JavaScript の実行結果を自動的に決定する機能が、パフォーマンスの最適化や自動セキュリティ チェックに役立つことを考えると、関数式もより高速に実行されることに賭けたいと思います。

于 2013-04-08T20:40:37.250 に答える