26

誰か (悪) が でタイマーを設定しsetIntervalたとしますが、その ID はわかりません (setInterval が返すオブジェクトへの参照も、その値もわかりません)。

(function(){
  setInterval(function(){console.log('pwned')},
              10000)
})();

クリアする方法、方法はありますか?他の方法でタイマーにアクセスすることは可能ですか? または、少なくとも特定のブラウザ/JavaScript エンジンでは?

David Flanagan は、彼の大きな JSTDG で同様のトピックに触れています。 setInterval() method, use in malicious codeインデックスのキーが指す

... 一部のブラウザーは、繰り返されるダイアログ ボックスと実行時間の長いスクリプトを検出し、それらを停止するオプションをユーザーに提供します。しかし、悪意のあるコードは setInterval() などのメソッドを使用して CPU をロードしたり、大量のメモリを割り当ててシステムを攻撃したりする可能性があります。Web ブラウザがこの種の人手による攻撃を防ぐことができる一般的な方法はありません。実際には、この種のスクリプトの乱用に関与しているサイトに戻る人はいないため、これは Web では一般的な問題ではありません。

4

4 に答える 4

49

簡単なテストから、すべての主要なブラウザー (最新の Chrome、Firefox、および IE) は ID として非常に小さい数字を与えるため、考えられるすべての数字を「盲目的に」ループするだけで問題なく動作するはずです。

function ClearAllIntervals() {
    for (var i = 1; i < 99999; i++)
        window.clearInterval(i);
}

完全な例:

window.onload = function() {
    window.setInterval(function() {
        document.getElementById("Tick").innerHTML += "tick<br />";
    }, 1000);
    window.setInterval(function() {
        document.getElementById("Tack").innerHTML += "tack<br />";
    }, 1000);
};

function ClearAllIntervals() {
    for (var i = 1; i < 99999; i++)
        window.clearInterval(i);
}
#Placeholder div { width: 80px; float: left; }
<button type="button" onclick="ClearAllIntervals();">Clear All</button>
<div id="Placeholder">
    <div id="Tick"></div>
    <div id="Tack"></div>
</div>

これはすべての間隔を停止しますが、もちろんその ID を知らずに特定の間隔を停止することはできません。

自分でテストできるように、上記のすべての主要なブラウザーで動作するはずです。

于 2011-07-27T11:15:44.443 に答える
13

まあ、Chrome での経験的な試行でsetIntervalは、呼び出しごとに増加する数値を返すことが示されています。したがって、 setInterval が最後に設定されたものであることが確実な場合は、次のように動作します。

function clearLastInterval () {
  var i = setInterval (function () {}, 10000);
  clearInterval (i-1);
  clearInterval (i);
}

私はこれをお勧めするかどうかはわかりませんが;-)

于 2011-07-27T11:05:16.020 に答える
8

#Shadow Wizard で提案されたアプローチを試してみたところ、間隔を空けることができました。しかし、このアプローチは後に副作用をもたらしました。私の特定のケースでは、すべての間隔をクリアした後、 jquery.fadeTo() を使用できませんでした。

私が落ち着いたアプローチは、 setInterval メソッドを再定義し、再定義されたメソッドに間隔 ID を保存するという、よりクリーンなソリューションです。ここに示すように、ID を配列に入れ、それらをすべてクリアします。配列を格納する構造をもう少し改良することで、配列にラベルを付けて選択的にクリアすることができます。

var intervalTracking = new Array();
var intervalCount=0;

window.oldSetInterval = window.setInterval;
window.setInterval = ( function(func, interval) {
    var interval = oldSetInterval(func, interval);
    intervalTracking[++intervalCount]=interval;
    return interval;
});

function clearAllIntervals() {
    for (var i = 0 ; i <= intervalCount ; i++) {
    window.clearInterval( intervalTracking[i] );
    }
}

これはうまくいくようです!

于 2011-10-05T15:36:41.563 に答える