setTimeout和setInterval返回的定时器ID是普通的、可伪造的数字,这是否存在安全问题?

问题描述 投票:0回答:2

虽然它至少揭示了一些潜在的干扰,但这并不是什么巨大的安全风险。

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

库1

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。有些人可能会说这不重要,犯这样的错误是多么愚蠢。

我认为这是一种不好的行为。由于我们在网站中加载越来越多的第三方库。也许一个正确的解决方案是

setInterval
setTimeout
应该返回一个真正唯一且不可伪造的对象,而不仅仅是数字自动递增 ID。

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

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

javascript security setinterval
2个回答
3
投票

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

不。

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

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

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


3
投票

有趣的一点。

由于间隔/超时 ID 是连续的,因此您可以(如您向我们展示的那样)通过获取下一个间隔 ID 来清除所有间隔/超时,而不是尝试清除任何低于您获得的 ID。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.