添加 rel="noopener noreferrer" 是防御 target="_blank" 导致 opener 劫持的最直接有效方式,可使新页面 window.opener 为 null;noopener 是核心,noreferrer 补充防 Referer 泄露。
使用 a 标签的 target="_blank" 时,新打开的页面会通过 window.opener 获得对原始页面的引用权限,攻击者可借此调用 window.opener.location = 'https://evil.com' 等方式劫持原页面跳转,实施钓鱼或中间人攻击。关键防护手段是切断这种跨窗口控制链。
这是最直接有效的防御方式。现代浏览器中,加上这两个属性后,新页面的 window.opener 将为 null,彻底阻断恶意脚本对原页面的操作能力:
注意:noopener 是核心防护项,noreferrer 是补充(还能阻止 Referer 泄露),二者常一起使用。仅写 rel="noopener" 已足够防御 opener 劫持。
有人试图用 onclick="window.open(...)" 替代原生 target,但若未显式传入 opener: null 选

onclick="window.open('https://x.com')"
onclick="window.open('https://x.com', '_blank', 'noopener')
推荐优先使用原生 HTML + rel 属性,语义清晰、兼容性好、无需 JS 支持。
对于大量用户生成内容(如博客评论、富文本编辑器输出),手动加 rel 易遗漏。可在服务端渲染或前端富文本解析阶段统一处理:
target="_blank" 的 标签rel="noopener noreferrer"(若原无 rel 或不包含 noopener)rel 值(如 rel="nofollow" 应合并为 rel="nofollow noopener noreferrer")部分 UI 组件库(如旧版 Ant Design、某些 Markdown 渲染器)或 CMS 插件可能默认生成不带 rel 的 target="_blank" 链接。上线前应:
linkRel 类似参数