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

mar*_*lin 1 fetch cors cross-origin-read-blocking

我正在尝试 从using模式中获取html位于 url 的文件,但响应被 CORB(跨源读取阻塞)阻止。https://sub.app.test/htmlhttps://app.testno-cors

fetch('https://sub.app.test/html', { mode: 'no-cors'})
Run Code Online (Sandbox Code Playgroud)

为什么?

mar*_*lin 5

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

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

  • 提供来自同一来源的资源 ( app.test)
  • 使用cors模式(服务器需要添加正确的Access-Controlheader)
  • 将 MIME 类型更改为其他内容text/html或根本不设置标题(hacky)

阅读更多: