应始终为 target="_blank" 添加 rel="noopener",否则新页面可通过 window.opener.location 重定向原页面;rel="noopener" 可切断 opener 引用,防止钓鱼攻击。

target="_blank" 会在新标签页打开链接,但默认有安全风险
它确实让 <a></a> 链接在新标签页中打开,不是当前页覆盖跳转。但现代浏览器(Chrome 88+、Firefox 79+、Safari 14.1+)会给新页面赋予 window.opener 权限——这意味着新开的页面能通过 window.opener.location = 'https://evil.com' 把你的原页面重定向到钓鱼网站。
不加 rel="noopener" 就等于开后门
直接写 target="_blank" 而不配 rel="noopener",等同于主动暴露原页面控制权。攻击者只要诱导用户点击一个恶意链接(哪怕只是广告或评论区链接),就可能劫持你的整个站点上下文。
-
rel="noopener"会切断window.opener引用,新页面无法访问原页面的window对象 - 如果还需兼容旧版 Safari(rel="noreferrer",它同时禁用
Referer头并隐式包含noopener - 不要只写
rel="noreferrer"而漏掉noopener:某些老版本浏览器对noreferrer的实现不完整,noopener是更底层、更可靠的防护
什么时候必须用 target="_blank"
不是所有外链都要新标签打开,关键看用户预期和操作连续性:
- 站外文档引用(如 MDN、RFC、PDF 原文)、第三方登录回调地址、独立工具页(如在线 JSON 格式化器)——适合
target="_blank" rel="noopener" - 站内路由跳转(如
/help、/settings)——一律用target="_self"或不写,避免打断 SPA 状态 - 表单提交目标(
<form target="_blank"></form>)——极少见,且必须确认后端响应是可展示文档(如 PDF/HTML 报告),否则新标签页会卡在空白或报错
target="_blank" 在 iframe 或框架页里表现不同
如果页面嵌在 <iframe></iframe> 中,target="_blank" 依然会在顶层浏览器新建标签页;但 target="_parent" 和 target="_top" 才会影响框架层级。这点容易被忽略——你以为点了链接会跳出 iframe,结果发现它只是在 iframe 内部加载了新内容,那大概率是误用了 _self 或没设对 target 值。
真正要“彻底跳出所有框架”,得用 target="_top",而不是依赖 _blank。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











