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

Oma*_*awi 5 javascript security setinterval

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

假设我们有那些非常封闭的 JavaScript 模块,它们在彼此不了解的情况下加载到我的页面中。它们来自“受信任的”,但是 lib2 中的某些开发人员犯了错误,请参阅代码。

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

setInterval(function(){
   alert('I am doing some important stuff');
}, 1000);
Run Code Online (Sandbox Code Playgroud)

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

var i = setInterval(function(){}, 0);
for(; i >= 0; i-=1) {
    clearInterval(i);
}
Run Code Online (Sandbox Code Playgroud)

我的 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>
Run Code Online (Sandbox Code Playgroud)

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

我认为这是一种不良行为。由于我们在我们的网站中加载了越来越多的 3rd 方库。也许一个合适的解决方案是setInterval,并且setTimeout应该返回一个真正唯一且不可伪造的 Ojbect,而不仅仅是数字自动增量 ID。

有人可能会为此想出一个现实世界的利用(仍然没有测试它是否是跨帧,我真的怀疑)。

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

Mik*_*uel 3

es5 中的严格模式可以克服这个问题吗?

不是。 setIntervalsetTimeout是 DOM 绑定的一部分——它们不是 EcmaScript 内置函数,因此在任何版本的 EcmaScript 中都没有指定。严格模式下没有任何东西会具体影响它们。

这可能会在 EcmaScript 的下一版本中发生变化,因为 TC39 委员会认为并发性是需要指定的核心语言功能,并且可能会保留事件循环并发性

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