target="_blank"必须配rel="noopener noreferrer",否则新页面可通过window.opener篡改原页或窃取隐私;仅noopener仍泄露Referer;_parent/_top仅用于iframe;非标准值如_new、_search均不安全且无效。

target="_blank" 必须配 rel="noopener noreferrer"
单独写 target="_blank" 是危险的。新页面能通过 window.opener 直接修改你原来的页面,比如跳转到钓鱼页、读取登录态,甚至拖慢你页面的性能。现代浏览器(Chrome/Firefox/Safari/Edge)都默认启用这个攻击面,除非你主动切断。
正确写法只有一种推荐形式:rel="noopener noreferrer" 必须同时存在:
-
noopener切断window.opener引用,让新页面无法访问原页面上下文 -
noreferrer阻止 Referer 头泄露来源 URL,保护用户隐私 - 漏掉任意一个,都不算安全落地;只写
rel="noopener"仍会发 Referer - 不要写成
rel="noreferrer noopener"—— 顺序不重要,但语义上noopener是底线
target="_self" 是默认行为,显式写出来通常只为覆盖 base 标签
target="_self" 就是“在当前标签页打开”,它和不写 target 效果完全一样。大多数时候没必要写。
唯一常见需要显式写的场景是:页面顶部有 <base target="_blank">,它会给所有相对链接兜底设成新标签页。这时某个内部链接想保持当前页跳转,就必须加 target="_self" 覆盖它。
立即学习“前端免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
注意:target="self"(没下划线)是无效值,会被当作文本窗口名处理,最终 fallback 到 _self,但属于非标准写法,别这么用。
target="_parent" 和 target="_top" 只在 iframe 嵌套时有意义
这两个值不是为普通网页设计的,而是为 <iframe> 场景服务的:
-
target="_parent":在父<iframe>所在的上下文中加载。如果当前链接就在顶层页面,那它等价于_self -
target="_top":强制跳出所有嵌套层级,在最外层窗口加载。常用于防止被第三方网站用 iframe 套住后无法跳转 - 现代单页应用(SPA)基本不用框架集,所以这两个值极少出现在日常开发中
- 误写成
target="parent"或target="top"(缺下划线)——浏览器当自定义窗口名处理,找不到就新建,但没noopener保护,有风险
别碰 _new、_search、_window 这类“看着像”的非标准值
这些不是 HTML 规范值,W3C 和 WHATWG HTML Living Standard 明确只承认四个下划线开头的保留字:_self、_blank、_parent、_top,外加一个可选的自定义窗口名(如 target="myPopup")。
常见错误写法及后果:
-
target="_new":浏览器尝试找叫_new的窗口,找不到就新建——但新建窗口没noopener,存在安全隐患 -
target="_search":IE5–8 实验性支持,HTML5 已移除,现代浏览器直接忽略,退化为_self -
target="new"(无下划线):被当作文本窗口名,行为不可控,且控制台可能报 “Invalid target name” 警告 - 大小写敏感:
target="MyPopup"和target="mypopup"是两个独立窗口,别指望复用
真正需要复用窗口时,优先考虑 JavaScript 控制 window.open(),而不是依赖 target 的隐式窗口复用逻辑——后者在 PWA、Service Worker、多标签协同场景下极易失效。


















