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.document、opener.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)。