rel="noopener"必须配合target="_blank"才生效,单独使用无效;window.open()不支持rel属性,需用"noopener=yes"或退回到标签;noopener是安全底线,noreferrer不能替代它。

必须配 target="_blank",否则 rel="noopener" 完全不生效。 它不是运行时拦截器,而是浏览器在创建新浏览上下文时跳过 opener 初始化的开关——没触发这个创建动作,就压根不会启动该机制。
为什么 rel="noopener" 单独写无效
浏览器只在以下三种场景下解析并应用 rel="noopener":
<a href="..." target="_blank" rel="noopener"></a><form target="_blank" rel="noopener"></form>-
window.open(url, "_blank")(此时rel属性无效,见下节)
常见错误是给 target="_self" 或 target="_parent" 的链接硬塞 rel="noopener",这既不切断 opener,也不影响 Referer,纯属无效配置。更隐蔽的问题是富文本编辑器或 CMS 自动补 target="_blank",但完全忽略 rel,上线后直接暴露高危漏洞。
window.open() 不能靠 rel 属性控制
rel 是 HTML 属性,对 JS 主动开窗无作用。下面写法全部错误:
立即学习“前端免费学习笔记(深入)”;
window.open(url, "_blank", "noopener") window.open(url, "_blank", "noopener=1")
因为 "noopener" 不是标准 features 字符串参数。正确做法分情况:
- 同源且兼容 Chrome/Edge:用
window.open(url, "_blank", "noopener=yes") - 跨域或需兼容旧 Safari(≤12.0):改用
location.replace()+ 新窗口监听,或退回<a></a>标签触发(带rel="noopener noreferrer") - 绝对不要只写
window.open(url)或window.open(url, "_blank"),默认保留完整 opener 引用
rel="noopener" 和 rel="noreferrer" 别混用顺序或替代
noopener 是安全底线,强制 window.opener === null;noreferrer 是隐私补充,清空 Referer 头并多数情况下隐式启用 noopener——但它不可替代前者。
- 旧版 Safari(≤12.0)和部分 WebView 中,
rel="noreferrer"不保证window.opener为null - 某些 Markdown 渲染器按顺序取第一个合法
rel值,写成rel="noreferrer noopener"可能只认noreferrer - 若业务强依赖 Referer(如来源统计),至少保留
rel="noopener",别为 Referer 放弃安全
真正容易被忽略的是服务端渲染或 CMS 输出环节:用户粘贴外链、评论自动转超链接、后台富文本生成 HTML……这些地方 target="_blank" 常被自动加上,而 rel 几乎从不自动补全。防御重点不在前端手写,而在构建流程或模板层做统一拦截与注入。



















