IE11 中 rel="noreferrer" 不提供 window.opener 隔离,仅隐藏 referer;必须搭配 rel="noopener" 才能彻底断开 JS 引用,防止反向劫持。

IE11 中 rel="noreferrer" 不等同于 rel="noopener"
在 IE11(以及部分旧版 Edge)中,rel="noreferrer" 完全不支持 window.opener 隔离——它只影响 document.referrer 和 HTTP Referer 请求头,对 opener 引用毫无约束。这意味着攻击者仍可通过 window.opener.location.href = 'phishing.com' 劫持你的页面。
为什么不能只靠 noreferrer 来防反向控制
根本原因在于规范实现差异:noreferrer 是为隐私设计的(隐藏来源 URL),而 noopener 是为安全设计的(切断 JS 对象引用)。IE11 实现了前者,但没实现后者。
-
rel="noreferrer"→document.referrer === '',但window.opener仍指向原页面window对象 -
rel="noopener"→window.opener === null,彻底断开 JS 关联 -
rel="noopener noreferrer"→ 同时满足安全 + 隐私,且在 IE11 中noopener起效(IE11 支持该值)
target="_blank" 在 IE11 下必须加 noopener
只要链接带 target="_blank" 且跳转到不可信域名(如广告、用户提交的外链、第三方平台),就必须显式写 rel="noopener"。ESLint 的 react/jsx-no-target-blank 规则报这个错,不是为了兼容性“保险起见”,而是因为 IE11 真的不认 noreferrer 的安全能力。
- 不加
noopener:IE11 用户打开链接后,原页面可能被静默跳转 - 只加
noreferrer:referral 隐藏了,但安全漏洞仍在 - 加
noopener noreferrer:最稳妥,现代浏览器也完全兼容
现代开发中要不要主动删掉 noreferrer
不用删。虽然 Chrome/Firefox/Edge 从 2020 年起默认对 target="_blank" 行为注入 noopener,但 IE11 不在此列;而且 noreferrer 仍有独立价值——它阻止 Referer 泄露,这对保护内部路径、避免敏感参数出现在第三方日志里很关键。
- 删
noreferrer≠ 更安全,只是少了一层隐私控制 - 删
noopener→ 在 IE11 上直接放弃防御 - 保留
rel="noopener noreferrer"是最小成本、最大覆盖的实践

















