对 html 资源获取的 no-cors 不透明请求被 CORB 阻止

no-cors opaque request for html resource fetch blocked by CORB

我正在尝试使用 no-cors 模式从 https://app.test 获取位于 url https://sub.app.test/htmlhtml 文件,但响应被 CORB 阻止(跨源读取阻塞)。

fetch('https://sub.app.test/html', { mode: 'no-cors'})

为什么?

即使使用 no-cors 模式(因此响应不需要 Access-Control-Allow-Origin 被允许)请求被 CORB 阻止,因为 html 内容被认为数据资源(它可能包含敏感数据)。任何具有 MIME 类型 text/html 的资源(并且 html 在响应中被嗅探 body 或 X-Content-Type-Options: nosniff 被设置)将被 CORB 阻止,以便敏感数据不能使用推测泄露side-channel 像 Spectre 漏洞这样的攻击(资源不会被添加到站点渲染器的内存中)。

有几种方法可以绕过这个限制:

  • 从同一来源提供资源 (app.test)
  • 使用cors模式(服务器需要添加正确的Access-Controlheader)
  • 将 MIME 类型更改为 text/html 以外的类型,或者根本不设置 header(hacky)

阅读更多: