在 ES9(ECMAScript 2018)中,新加入了 SharedArrayBuffer(共享内存数组)这一特性,它允许在多个 web worker(Web 工作线程)之间共享内存。这个新特性虽然带来了一些很棒的功能,但是也存在一些安全问题。
SharedArrayBuffer 的安全问题
在升级到 ES9 后,浏览器的 JavaScript 引擎就开始支持 SharedArrayBuffer,Web 应用程序可以使用它来提高多个线程之间的数据共享性能。但是由于浏览器的安全模型,使用 SharedArrayBuffer 对象存在以下几个安全问题:
- 跨站脚本(XSS)攻击:SharedArrayBuffer 存在多种针对浏览器漏洞的攻击方式,其中最常见的是跨站脚本攻击(XSS)。攻击者可以通过注入恶意 JavaScript 代码并在浏览器中执行来访问共享内存区域,这就给攻击者提供了一个共享内存攻击的门户。
- 崩溃:由于 SharedArrayBuffer 可以被多个线程访问和修改,因此任意线程意外修改了内存数据,可能导致程序崩溃。
- 数据泄露:SharedArrayBuffer 中的数据不受同源策略的限制,因此可能会面临数据泄露的风险。
因此,为了保证 SharedArrayBuffer 的安全性,必须采取一些安全措施。
SharedArrayBuffer 的安全解决方案
为了解决 SharedArrayBuffer 的安全问题,Chrome 和 Firefox 浏览器在 2018 年 5 月暂时禁用了它。在之后,浏览器厂商们开始运用新的安全措施,使得 SharedArrayBuffer 能够被安全地使用。
全局设置
首先是设置了全局标志位,标志位可以将 SharedArrayBuffer 对象的使用限制在同源环境中。因此,只有在同源页面之间使用 SharedArrayBuffer 才足够安全。这意味着如果你尝试从一个不同的源再次使用它,你将得到一个错误。
-- -------------------- ---- ------- -- ------------ -- -------------------------- - ------------------------------------------- - ---------- - -- --------------------- - ----- --- ------------- ------- ------ ------- ------ ------------------- --------------- -- - - -
强制浏览器重新检查安全性
另一种方法是强制浏览器重新检查 SharedArrayBuffer 的安全性。这种方法可以让浏览器能够识别不安全的场景。在 Chrome 和 Firefox 浏览器中,出现以下或类似提示:This document requires 'SharedArrayBuffer' which has been disabled.
跨域设置
另外,Chrome 和 Firefox 浏览器已经解决了 SharedArrayBuffer 可能会被用于跨站脚本攻击的问题。为了使跨站脚本攻击不再成立,Chrome 和 Firefox 浏览器在跨域请求中已经禁用了 SharedArrayBuffer。
下面是一个示例代码:
-- -------------------- ---- ------- ----- ----------------- - --- --------- --------------- ------------------- ----------------------------------- ---- --- ----- -------- ------------ ---- - ---- - ----- --- - ----- ---------- - ------- ------ ------------ ---------- ----- ------- -------- ------------------ ----- --------------------- -- --------- ------- --- ------------------------ --- -- -------- - ------ ----- ----------- - ---- - ------------------------------- ----- --- ---------------- - -
结论
虽然在 SharedArrayBuffer 的初始版本中存在一些安全问题,但浏览器厂商们已经采取了措施来解决这些问题,使得该特性能够被安全地使用。SharedArrayBuffer 是一个有大量潜力的特性,它为 Web 应用程序带来了更强大的多线程能力,也使得我们更容易地开发客户端和服务器的互操作性应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674eb82fe884a3e30f295e6a