乐趣区

关于跨域:SharedArrayBuffer-及其跨域下的使用

什么是跨域

跨域问题是前端开发人员背后绕不过来的问题。
所谓跨域,艰深点表白,就是以后站点,申请或加载了其余域名的资源。
比方以后 app.a.com 申请了 file.b.com 的资源,就产生了跨域资源的加载。

浏览器在渲染以后页面时,校验网页申请的资源是否能够平安的在以后页面应用。
比方:

  1. 是同站点下的资源,比方 app.a.com/logo.png,能够间接应用
  2. 如果是同域名下的资源,比方 file.a.com/logo.png, 这时会校验文件的响应头,看有没有配置 Access-Control-Allow-* 相干的访问控制参数
  3. 如果是 file.b.com/logo.png 同样也会去校验访问控制信息信息

如果资源的访问控制信息不能外表资源能够在以后站点应用,就会产生跨域的问题,浏览器会禁止资源的加载和展现。
也就是说跨域问题其实是浏览器对资源应用安全策略产生的,浏览器要保障站点拜访资源是平安,非法拜访的。

浏览器是否能够应用某个资源有两个限度:

  1. 以后站点是否容许应用其余站点,域名的资源
    站点能够配置是否容许拜访其余域名的资源,比方在站点配置一些安全策略

    # COEP 跨域嵌入策略,会阻止页面加载任何未明确授予文档许可权的跨域资源(应用 CORP 或 CORS)。Cross-Origin-Embedder-Policy: require-corp
    # COOP 
    Cross-Origin-Opener-Policy: same-origin
    
  2. 申请的资源是否能够在以后站点应用
    资源是否开启了跨域资源共享策略,决定资源在哪些站点能够被应用,个别解决跨域的时候,须要在资源的响应头中配置以下选项

    # 跨域资源策略
    Cross-Origin-Resource-Policy: same-site | same-origin | cross-origin
    # cross-origin 示意该资源被任何站点应用
    
    # 容许通过哪些办法拜访
    Access-Control-Allow-Methods: GET | POST | PUT | OPTIONS | HEAD
    
    # 容许哪些域名拜访,* 代表所有,一般来说不平安
    Access-Control-Allow-Origin: *

什么是 SharedArrayBuffer

SharedArrayBuffer(以下简称 SAB) 是一个 javascript 对象,用于网站线程之间的内存数据共享,比方 worker。同样因为 WebAssembly 应用 worker 模仿了多线程,所以在这种状况下同样会应用到 SAB 做数据共享拜访。

为什么应用 SAB 会遇到跨域问题

18 年 spectre 曝光之前,曾经有不少网站应用了 SAB。因为 spectre 是 cpu 层面的破绽,不太可能通过 cpu 降级去解决,因而过后所有浏览器间接禁用了 SAB,来避免 spectre 的旁路攻打。
那么什么是 spectre 攻打,用艰深一点的话来说,就是 cpu 有一个机制,叫做预测机制,如果有一个恶意程序去查问一个没有权限的信息,操作系统会返回禁止的信息,自身来说这个逻辑当然没有问题。然而当恶意程序询问时,其实操作系统即便返回了禁止的信息,然而还是会因为预测机制会去执行正确答案的逻辑,会导致慢了一小段时间,比方几微秒,几毫米,这就被恶意程序留神到了,通过每隔一段时间一直去尝试询问,达到获取正确答案的成果。
恶意程序能够通过 SAB 获取到其余页面的敏感信息。咱们都晓得 worker 在浏览器中有很大的限度,比方不能拜访 window, document 对象,SAB 是用来和主线程进行数据交换拜访的高效办法,也被大量利用,这就会导致 worker 是有方法通过 SAB 攻打获取到主线程的敏感信息。
所以在 spectre 破绽曝出时,简直所有支流浏览器都默认敞开了 SAB 以应答这个破绽的攻打。

如何解决

SAB 作为 WebAssembly(wasm) 模仿多线程的根底组件,如果不能应用,将会对 wasm 在某些利用场景的性能大幅降落。从新启用是势在必行。
在 chrome 92 之前,chrome 是默认开启 SAB 的,然而曾经弹出正告信息提醒 SAB 将会在 92 版本必须启用以下选项:

# COEP 跨域嵌入策略,会阻止页面加载任何未明确授予文档许可权的跨域资源(应用 CORP 或 CORS)。Cross-Origin-Embedder-Policy: require-corp
# COOP 
Cross-Origin-Opener-Policy: same-origin

也就是说加载的资源必须有 corp 策略的头信息,跨域关上者也是同域名

相干材料

  • 对于 SharedArrayBuffer spectre 攻打的探讨
    https://github.com/tc39/secur…
  • 应用 SharedArrayBuffer 进行 Spectre 攻打的原理
    https://www.giantbranch.cn/20…
  • 为什么须要“跨域隔离”能力取得弱小的性能
  • Same origin : https://web.dev/same-origin-p…
  • 跨域隔离启用指南:https://web.dev/cross-origin-…
  • https://v8.dev/blog/spectre
  • https://web.dev/coop-coep/
  • https://www.cnblogs.com/Sheph…
退出移动版