target="_blank"会暴露window.opener,因浏览器规范要求未加rel="noopener"时新页面的window.opener必指向原页面,跨域亦不拦截;rel="noopener"强制将其设为null,彻底切断引用,而非仅限制访问。

为什么 target="_blank" 会暴露 window.opener?
浏览器规范明确要求:只要没加 rel="noopener",用 target="_blank" 打开的页面,其 window.opener 就会指向原始页面的 window 对象。这不是 bug,是设计行为——跨域也不拦它。恶意页面只要执行 window.opener.location.href = 'https://fake-login.example',你切回原标签时看到的就是钓鱼页。
rel="noopener" 到底做了什么?
它强制把新页面的 window.opener 设为 null,不是“限制访问”,而是从引用层面直接切断。新页面执行 window.opener.location 会报错或静默失败,window.opener.document.write() 也无效。现代浏览器(Chrome 64+、Firefox 79+、Safari 12.1+)虽在部分场景下隐式应用该行为,但显式声明才是唯一可靠方式。
只写 rel="noreferrer" 为什么不行?
rel="noreferrer" 只管 Referer 头,不管 window.opener。旧版 Safari(11.1 之前)、IE11 完全不认它对 opener 的影响;即使在新版中,它也不保证 window.opener === null。常见错误包括:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- CMS 富文本编辑器自动补
target="_blank",但漏掉rel属性 - 写成
rel="noreferrer noopener",某些 Markdown 渲染器按顺序取第一个值,结果只生效noreferrer - 误以为 “浏览器默认已修复” 就不加,结果被安全扫描工具标为高危
什么时候必须加,什么时候可以不加?
只要链接目标不可信,就必须加 rel="noopener"。典型场景包括:用户评论里的外链、第三方平台跳转、广告位、社交媒体分享按钮。唯一例外是内部微前端子应用之间需要双向通信,且你完全控制两端代码——此时应改用 postMessage 协议,而非裸露依赖 window.opener。
容易被忽略的是:即使你加了 rel="noopener",如果同时用了 rel="nofollow",别拼成 rel="noopener nofollow" 这种单属性多值写法——某些老旧解析器可能截断或误判。稳妥做法是分开声明,或确保 CMS 输出逻辑已做归一化处理。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










