为什么 `Cross-Origin-Opener-Policy: unsafe-none` header 不安全?

Why is a `Cross-Origin-Opener-Policy: unsafe-none` header unsafe?

我们最近将一个 Web 应用程序升级到了 Django 4,现在默认情况下添加了一个

Cross-Origin-Opener-Policy: same-origin

header 到 http 响应,这会导致 window.opener 在 child window 中变为 null。这破坏了我们的一个页面,其中我们有一个 child window(用于 SSO 身份验证)在完成后将 postMessage() 发送回 parent window它的事。

我知道我可以通过手动将 header 设置为 unsafe-none 或以不同方式构建这些页面等来解决这个问题,但我很好奇 [= 有什么潜在的不安全之处39=] window 可以访问 window.opener?

浏览器保持 window.opener 相当锁定,除了调用 postMessage() 和其他一些小事情外,child windows 无能为力.

既然如此封锁,那不安全呢? 有人可以举例说明 child window 可以用 window.opener 浏览器允许 做的破坏性事情吗?

这在 MDN 上关于 noopener, which refers to this blog post 的页面上有简要说明。

直接引用本博客:

TL;DR If window.opener is set, a page can trigger a navigation in the opener regardless of security origin.

This is a relatively harmless example, but instead it could’ve redirected to a phishing page, designed to look like the real index.html, asking for login credentials. The user likely wouldn’t notice this, because the focus is on the malicious page in the new window while the redirect happens in the background.

您应该重新设计登录流程,这样它就不需要不安全的 header。特别是如果您接受来自用户的任意链接。