不是JavaScript setTimeout和setInterval有一些潜在的安全漏洞

时间:2012-01-12 09:19:03

标签: javascript security setinterval

这不是一个巨大的安全风险,尽管它至少揭示了一些潜在的干扰。

假设我们将那些非常封闭的JavaScript模块加载到我的页面中而不知道彼此。他们来自"信任"但是lib2中的一些开发人员犯了一个错误,请参阅代码。

Lib1 http://good.site/libs/the-famous-important-lib1.js

setInterval(function(){
   alert('I am doing some important stuff');
}, 1000);

Lib2 http://not-excelent.site/libs/the-cool-lib2.js

var i = setInterval(function(){}, 0);
for(; i >= 0; i-=1) {
    clearInterval(i);
}

我的Html

<script src="http://good.site/libs/the-famous-important-lib1.js" type="text/javascript"></script>
<script src="http://not-excelent.site/libs/the-cool-lib2.js" type="text/javascript"></script>

在浏览器中或至少在Firefox上,加载Lib2实际上会完全破坏Lib1。有些人可能会说这不重要,犯这样的错误是多么愚蠢。

我认为这是一种不良行为。因为我们在网站上加载了越来越多的第三方库。也许正确的解决方案是setIntervalsetTimeout应该返回一个真正唯一且不可伪造的Ojbect,而不仅仅是数字自动增量ID。

有人可能会对此进行实际利用(如果它是交叉帧,我仍然没有进行测试,我对此表示怀疑)。

问题是:是吗? es5中的严格模式是否克服了这一点?

2 个答案:

答案 0 :(得分:3)

有趣的一点。

由于间隔/超时ID是连续的,您可以(如您所示)通过获取下一个间隔ID清除所有间隔/超时,而不是尝试清除任何低于您的ID。

但是,我没有看到任何安全威胁。任何Web应用程序,仅基于Javascript中的间隔和/或超时来确定其安全性,无论如何都和黑客一样好。

正如Sergio Tulentsev已经评论过的那样 - 滥用clearInterval / clearTimeout肯定会破坏事情 - 但是(99%的时间)不会对网络应用程序造成任何安全威胁。

答案 1 :(得分:3)

  

es5中的严格模式是否克服了这一点?

没有。 setIntervalsetTimeout是DOM绑定的一部分 - 它们不是EcmaScript内置的,因此未在任何版本的EcmaScript中指定。严格模式中的任何内容都没有特别影响它们。

这可能会在下一版本的EcmaScript中发生变化,因为TC39委员会认为并发是一种需要指定的核心语言功能,可能会保留event loop concurrency

这些变化不太可能影响你提出的问题。 Caja / Secure EcmaScript(SES)确实确保间隔和超时ID不可猜测。