假设有人(邪恶)给我们设置了一个计时器setInterval
,但我们不知道它的 ID(我们没有 setInterval 返回的对象的引用,也没有它的值)
(function(){
setInterval(function(){console.log('pwned')},
10000)
})();
有办法吗,怎么清除?是否可以通过其他方式访问计时器?或者至少在特定的浏览器/javascript 引擎中?
David Flanagan 在他的大 JSTDG 中提到了类似的主题。setInterval() method, use in malicious code
索引中的键指向
...某些浏览器会检测重复的对话框和长时间运行的脚本,并向用户提供
阻止他们的选项。但恶意代码可以使用 setInterval() 等方法来
加载 CPU,还可以通过分配大量内存来攻击您的系统。有
Web 浏览器没有通用的方法可以防止这种笨手笨脚的攻击。在
实际上,这并不是网络上的常见问题,因为没有人返回到该网站
参与这种脚本滥用!
从快速测试来看,所有主要浏览器(最新的 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>
这将停止all间隔,当然不能在不知道其 ID 的情况下停止特定间隔。
正如您可以自己测试的那样,它应该适用于上述所有主要浏览器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)