移动体验 / 方法解读

移动端网页为何无法读取跨域资源?检查 Cross-Origin-Resource-Policy 响应头

当移动端网页请求跨域资源失败时,应优先检查目标资源是否设置了 Cross-Origin-Resource-Policy 响应头。

确认资源是否被 CORP 策略拦截

移动端网页请求跨域资源失败时,首先需要确认目标资源服务器是否配置了 Cross-Origin-Resource-Policy 响应头。该策略允许网站选择性地拒绝来自其他源(Origin)的请求,以缓解 Spectre 等推测性侧信道攻击以及跨站脚本包含攻击。CORP 是在默认同源策略之上的额外保护层,如果服务器设置了该头,浏览器将根据策略值决定是否允许读取响应内容。

检查时可以使用浏览器开发者工具的 Network 面板,查看目标资源的响应头列表。如果存在 Cross-Origin-Resource-Policy 字段,说明该资源启用了跨域保护机制。此时需要进一步确认具体的策略值,因为不同的值决定了允许访问的来源范围。这一步是排查跨域读取失败的关键前提,只有确认了策略的存在,才能进行后续的配置调整。

分析 CORP 策略值的含义与影响

Cross-Origin-Resource-Policy 响应头支持三种值,每种值对跨域请求的处理方式不同。same-site 值表示只有来自同一站点的请求才能读取资源,而 same-origin 值则要求请求来源的协议、主机和端口完全一致。cross-origin 值则允许任何来源的请求读取资源,这通常与 Cross-Origin-Embedder-Policy 配合使用。如果当前请求的来源不符合策略要求,浏览器将阻止读取响应体。

在移动端场景中,由于页面可能通过 iframe 嵌入或使用 img、script 等标签加载资源,错误的策略值会导致内容无法显示。例如,如果资源设置了 same-site 策略,而当前页面来自不同的注册域名,浏览器会剥离响应体,导致页面出现空白或加载错误。因此,理解这三种值的区别对于解决跨域读取问题至关重要。

排查 CORP 与 COEP 的配合关系

CORP 策略通常与 Cross-Origin-Embedder-Policy(COEP)配合使用,以增强安全性。COEP 可以要求嵌入文档的子资源必须是同源的,或者必须带有 CORP 头以表明可以嵌入。如果文档设置了 COEP 并要求子资源同源,而子资源未设置 CORP,那么跨域请求将被阻止。这种配合关系意味着在配置 CORP 时,需要同时考虑文档自身的 COEP 设置。

在排查问题时,除了检查资源本身的 CORP 头,还应检查当前文档是否设置了 COEP。如果文档设置了 COEP 并启用了 require-corp 模式,那么所有跨域子资源都必须带有 CORP 头才能正常加载。这种机制虽然提高了安全性,但也可能导致资源加载失败,需要根据实际业务需求谨慎配置。

验证 CORP 策略的有效性与潜在风险

CORP 策略仅对 no-cors 类型的跨域请求有效,这类请求通常由 CORS 安全的方法和头部发出。由于 CORP 通过响应头表达,浏览器不会阻止请求的发出,而是阻止响应体的泄露。这意味着攻击者无法通过侧信道获取敏感数据,从而有效防御 Spectre 等攻击。然而,在验证时需要注意,如果策略设置不当,可能会影响正常的业务功能。

需要注意的是,在 Chrome 浏览器中存在一个已知 Bug,设置 Cross-Origin-Resource-Policy 可能会破坏 PDF 的渲染,导致用户无法阅读 PDF 的后续页面。因此,在生产环境中使用该头时需要格外谨慎,建议先在测试环境中验证其对业务功能的影响,确保不会造成用户体验的负面影响。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. Cross-Origin Resource Policy (CORP) - HTTP | MDN ↗
← 更多移动体验文章返回顶部 ↑