target="_blank" 必须配 rel="noopener noreferrer",否则新页面可操控原页面;动态生成链接、富文本、cms、框架渲染及 window.open 均易遗漏;target 值必须严格为五个合法值之一,非法值使 rel 失效。

target="_blank" 不加 rel 就是安全漏洞
单独写 target="_blank" 等于把当前页面的 window.opener 控制权交给新页面——它能立刻执行 window.opener.location.replace() 跳转、window.opener.document.write("") 清空 DOM,甚至用死循环拖垮渲染线程。这不是理论风险,TikTok 2023 年真实被利用过。
必须同时写 rel="noopener noreferrer":
-
noopener是核心:强制新页面的window.opener为null,彻底切断控制链 -
noreferrer是补充:阻止 Referer 泄露,且在旧版 Safari(≤10.0)中辅助加固 - 写法必须严格小写、无空格、无连字符:
rel="noopener noreferrer"✅,rel="NOOPENER"❌,rel="noopener noreferrer "(末尾空格)❌
动态生成链接时 rel 容易被漏掉
手动写 HTML 时还能记得补 rel,但这些场景几乎 100% 漏掉:
- 富文本编辑器(如 CKEditor、TinyMCE)导出的 HTML,默认不加
rel - CMS 或博客系统自动生成外链(评论区、文章内嵌链接),只校验
href,不检查rel - Vue / React 中用
v-html或dangerouslySetInnerHTML渲染用户输入,target="_blank"可能被注入,但rel不会自动补 - 第三方组件库(如旧版 Ant Design 的
Link)默认不带rel,升级前需手动 patch
靠肉眼检查无效,建议用 Lighthouse 扫描,或正则匹配 <a>]*target=["']_blank["'][^>]*></a> 并验证是否含 rel=["'].*noopener。
window.open 也得配 noopener
window.open(url, "_blank") 表面看和 <a target="_blank"></a> 等价,实际更危险:它默认保留 window.opener 引用,且不自动加 noopener。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
正确写法必须显式传参:
- 调用必须由用户主动触发(如 click 内),否则会被弹窗拦截
- 第三个参数字符串里必须包含
"noopener":window.open(url, "_blank", "noopener") - 返回值可能为
null(被拦截时),记得判断
漏掉 "noopener" 字符串,就等于裸奔。
target 值写错等于白写
target 合法值只有五个:_self、_blank、_parent、_top、自定义 framename。其他写法浏览器不报错,但行为不可控:
-
target="blank"(漏下划线)、target="_new"、target="newtab"→ 降级为_self,表面跳转正常,实则掩盖了本该开新页的逻辑错误 -
target="mc"依赖严格匹配<iframe name="mc"></iframe>,大小写敏感、不能有空格;匹配失败时,不同浏览器降级策略不同(有的当_blank,有的当_self) -
<base target="_blank">会全局劫持所有链接,比单个标签漏rel更隐蔽难查
最常被忽略的是:即使你写了 rel="noopener noreferrer",如果 target 值本身非法,这个 rel 就完全不生效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










