跳到主要内容

a 标签跳转其他网站的安全问题

· 阅读需 2 分钟

这会使新窗口的 window.opener === null,完全无法引用原窗口,这在现代浏览器中已是推荐做法。

<a href="https://othersite.com" target="_blank" rel="noopener noreferrer">打开</a>

分割线


通过:

<a href="https://othersite.com" target="_blank">点击打开</a>

打开的是不同源的页面(比如你从 https://yoursite.com 打开了 https://othersite.com),那么在新窗口中:


window.opener 仍然存在,但受限于同源策略

  • 不是 null,但:
    • 你不能访问或操作 opener.documentopener.location 等敏感属性
    • 访问这些会抛出 DOMException: Blocked a frame with origin 错误。

🔐 安全限制背后的原因:

这是为了防止“反向控制”攻击,比如恶意网站伪装成你信任的网站打开你的网站,然后通过 window.opener 操控它(比如钓鱼、篡改页面等)。


🛡️ 如何彻底禁止被访问?

你可以在打开链接时加上:

<a href="https://othersite.com" target="_blank" rel="noopener noreferrer">打开</a>

这会使新窗口的 window.opener === null完全无法引用原窗口,这在现代浏览器中已是推荐做法。


总结:

情况window.opener 是否可访问是否同源推荐做法
同源✅ 完全可访问可交互通信
不同源⚠️ 存在,但访问敏感属性会报错使用 rel="noopener"
想禁止访问opener === null任意使用 rel="noopener"

你是想通过新页面反过来控制老页面?还是想让两个窗口通信?我可以给你推荐更安全或现代的做法(比如 postMessage)。