添加 rel="noopener noreferrer" 是防御 target="_blank" 导致 opener 劫持的最直接有效方式,可使新页面 window.opener 为 null;noopener 是核心,noreferrer 补充防 Referer 泄露。

使用 a 标签的 target="_blank" 时,新打开的页面会通过 window.opener 获得对原始页面的引用权限,攻击者可借此调用 window.opener.location = 'https://evil.com' 等方式劫持原页面跳转,实施钓鱼或中间人攻击。关键防护手段是切断这种跨窗口控制链。
添加 rel="noopener noreferrer"
这是最直接有效的防御方式。现代浏览器中,加上这两个属性后,新页面的 window.opener 将为 null,彻底阻断恶意脚本对原页面的操作能力:
注意:noopener 是核心防护项,noreferrer 是补充(还能阻止 Referer 泄露),二者常一起使用。仅写 rel="noopener" 已足够防御 opener 劫持。
避免依赖 JavaScript 模拟 target="_blank"
有人试图用 onclick="window.open(...)" 替代原生 target,但若未显式传入 opener: null 选项,仍可能保留 opener 引用(尤其在某些浏览器或配置下):
立即学习“前端免费学习笔记(深入)”;
- ❌ 不安全写法:
onclick="window.open('https://x.com')" - ✅ 安全写法:
onclick="window.open('https://x.com', '_blank', 'noopener')
推荐优先使用原生 HTML + rel 属性,语义清晰、兼容性好、无需 JS 支持。
服务端或 CMS 可自动补全 rel 属性
对于大量用户生成内容(如博客评论、富文本编辑器输出),手动加 rel 易遗漏。可在服务端渲染或前端富文本解析阶段统一处理:
- 匹配所有含
target="_blank"的标签 - 自动注入
rel="noopener noreferrer"(若原无rel或不包含noopener) - 注意不要覆盖已有合法
rel值(如rel="nofollow"应合并为rel="nofollow noopener noreferrer")
检查第三方组件和框架默认行为
部分 UI 组件库(如旧版 Ant Design、某些 Markdown 渲染器)或 CMS 插件可能默认生成不带 rel 的 target="_blank" 链接。上线前应:
- 审查生成的 HTML 源码
- 查阅组件文档是否支持配置
linkRel类似参数 - 必要时通过 DOM 遍历脚本动态补全(仅作兜底,不替代服务端修复)











