Chrome 无法打开谷歌链接从iframe在新窗口由于“跨起源开放政策”

tzdcorbm  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(197)

我有一个iframe,它包含一个链接,看起来像这样:

<a href="https://www.google.com/travel/flights/s/3nDqYBmu3h4Jfmwm6"
target="_blank" rel="noopener noreferrer">Purchase Flight</a>

在链接点击,我想它打开一个新的选项卡或窗口。但是,Chrome阻止页面加载,并出现以下错误(在响应下的网络选项卡中):

cross-origin-opener-policy: same-origin-allow-popups

-> This document was blocked from loading in an iframe with a sandbox
attribute because this document specified a cross-origin opener policy.

我没有在请求中设置任何特定的头,只是一个href链接。
该链接在Safari中正常打开,但在Chrome中无法正常打开。任何帮助都非常感谢!!

tyg4sfes

tyg4sfes1#

有2个信息可以帮助理解为什么会发生此错误:

  • iframe HTML element有一个名为sandbox的属性,它对iframe应用了许多限制
  • “设置该属性后,内容被视为来自唯一来源,表单和脚本被禁用,链接被阻止指向其他浏览上下文,插件被禁用”(1)
  • “沙盒导航浏览上下文标志:此标志防止内容导航除沙盒浏览上下文本身(或进一步嵌套在其中的浏览上下文)之外的浏览上下文...”(2)
  • Cross-Origin-Opener-Policy:HTTP头允许您确保顶级文档不与跨源文档共享浏览上下文组。其可能值为:
  • unsafe-none:默认值。允许将文档添加到其打开器的浏览上下文组中,除非打开器本身具有同源或同源允许弹出窗口的COOP
  • same-origin-allow-popups:保留对新打开的窗口或选项卡的引用,这些窗口或选项卡要么没有设置COOP,要么通过将COOP设置为unsafe-none来选择退出隔离
  • same-origin将浏览上下文专门隔离到同源文档。跨域文档不会加载在同一浏览上下文中。”
    根本原因

当从iframe打开链接时,会发生两件事:

  • sandbox属性被继承并应用于链接→链接现在被视为来自唯一的源。
  • 结合Google的COOP头→链接在新的浏览上下文中打开

→链接被阻止,原因是在沙盒iframe中,链接被阻止指向其他浏览上下文

解决方案

allow-popups-to-escape-sandbox添加到iframe的sandbox属性。这样,打开的链接就不会被沙箱化

  • allow-popups-to-escape-sandbox:允许沙盒文档打开新窗口,而不强制它们使用沙盒标志。例如,这将允许第三方广告被安全地沙箱化,而不会对广告链接到的页面施加相同的限制
    参考文献:
  • (1)https://www.w3.org/TR/2011/WD-html5-author-20110809/the-iframe-element.html#attr-iframe-sandbox
  • (2)https://html.spec.whatwg.org/multipage/browsers.html#sandboxed-navigation-browsing-context-flag

相关问题