在版本 91 之前,Chrome 中的计时器分辨率在启用网站隔离的桌面设备上限制为 5 微秒,在未启用网站隔离的 Android 设备上限制为 100 微秒。
从版本 91 开始,Chrome 将遵循规范变更,将各平台上显式计时器(performance.now()
、performance.timeOrigin
以及公开 DOMHighResTimestamps
的其他性能 API)的解析限制为 100 微秒。通过启用跨源隔离,网站可以将限制放宽到 5 微秒,无论平台如何。
SharedArrayBuffer
中也提出了类似的方法,即通过启用跨源隔离来获得更强大的功能。跨源隔离是一种状态,其中网页与其他源(已选择启用者除外)隔离。
我需要做些什么吗?
一般不会。在其他浏览器中,performance.now()
已被限制为采用更粗略的分辨率(例如,1 毫秒 = 0.001 秒),因此您不应依赖于当前分辨率。
同时,如果您希望提高计时器的分辨率(例如,更准确地衡量性能),则需要确保您的网站实现了跨源隔离。这样,您在 Chrome 和其他基于 Chromium 的浏览器以及 Firefox 中就能获得更妥善的解决方案。
计时器与跨源隔离有何关系?
在发现 Spectre 后,浏览器供应商决定将计时器限制为更粗略的分辨率(以及可用作隐式计时器的 SharedArrayBuffer)。这是因为 Spectre 和类似的推测执行攻击依赖于计时器来衡量某些操作所需的时间,然后猜测进程内存中的内容。
虽然可以使用粗略计时器执行推测性执行攻击,但高分辨率计时器可以加快攻击速度。Chrome 使用了其网站隔离架构以及其他机制来降低风险并重新启用这些功能,但仅限桌面平台和 Chromium 浏览器。让 API 依赖于底层浏览器架构并不是理想之举。
跨源隔离为浏览器提供了在隔离环境中运行网页的标准基准,使其无法加载不愿意的跨源资源,因此不会受到 Spectre 攻击的风险。借助跨源隔离,我们现在可以允许网页访问高分辨率计时器、SharedArrayBuffer
和其他 API,这些 API 在可以读取任意跨源数据的进程中公开是不安全的。
如需详细了解此次变更的背景信息,请参阅为何需要“跨源隔离”才能使用强大的功能。
封面照片由 Unsplash 用户 Linda Perez Johannessen 拍摄。