HTML链接中的rel="noopener"

rel="noopener" 是 HTML 中 <a> 标签(超链接)的一个安全属性,用于限制通过该链接打开的新窗口(或标签页)对原页面的访问权限,核心作用是防范潜在的安全风险和性能问题。

一、核心作用:解决「window.opener 安全漏洞」

当使用 <a target="_blank"> 打开新窗口时,浏览器会默认赋予新窗口一个特殊对象 window.opener,该对象允许新窗口直接操作原页面(如修改原页面的 URL、跳转至恶意网站、读取原页面部分信息等)。

而 rel="noopener" 的核心功能就是禁用新窗口的 window.opener 对象 ,让新窗口无法访问原页面,从而彻底阻断基于 window.opener 的恶意攻击。

二、具体风险场景(没有 rel="noopener" 时)

假设原页面有一个未加安全属性的链接:

html

xml 复制代码
<!-- 危险:新窗口可通过 window.opener 操控原页面 -->
<a href="https://恶意网站.com" target="_blank">点击访问</a>

当用户点击该链接后,新打开的「恶意网站」可以执行以下操作:

  1. 篡改原页面 URL :通过 window.opener.location.href = "https://钓鱼网站.com",将原页面跳转至钓鱼页面,诱导用户输入账号密码;
  2. 读取原页面信息 :在某些场景下,恶意网站可通过 window.opener 读取原页面的 document 对象、localStorage 等(虽有浏览器安全限制,但仍存在漏洞风险);
  3. 影响原页面性能:新窗口的 JavaScript 执行可能占用原页面的浏览器资源,导致原页面卡顿。

三、使用场景:所有 target="_blank" 的链接都建议添加

只要你的超链接需要用 target="_blank" 打开新窗口 / 标签页,无论链接指向的是自己的网站还是外部网站,都强烈建议添加 rel="noopener" ,尤其针对:

  • 指向外部第三方网站的链接(风险最高,无法控制第三方网站是否恶意);

  • 用户生成内容(UGC)中的链接(如评论区、论坛的用户分享链接,可能被注入恶意地址)。

正确用法示例:

html

xml 复制代码
<!-- 安全:新窗口无 window.opener 权限 -->
<a href="https://安全网站.com" target="_blank" rel="noopener">点击访问</a>

四、相关属性:rel="noreferrer"

除了 noopener,还有一个类似属性 rel="noreferrer",二者功能有重叠但不完全相同:

属性 核心功能 是否禁用 window.opener 是否隐藏「来源信息」(Referrer)
rel="noopener" 仅限制新窗口对原页面的访问权限 ✅ 是 ❌ 否(新窗口仍能获取原页面 URL)
rel="noreferrer" 同时限制 window.opener + 隐藏来源信息 ✅ 是 ✅ 是(新窗口无法获取原页面 URL)
  • 选择建议 :
    若仅需防范 window.opener 漏洞,用 noopener 即可;
    若需要额外隐藏原页面的来源(如不希望目标网站知道用户从你的页面跳转过去),可使用 noreferrer(但注意:隐藏 Referrer 可能影响目标网站的流量统计)。

五、浏览器兼容性

rel="noopener" 支持所有现代浏览器(Chrome 49+、Firefox 52+、Safari 10.1+、Edge 79+),对于极少数老旧浏览器(如 IE),虽不识别该属性,但这些浏览器本身也逐渐被淘汰,无需过度兼容。

综上,rel="noopener" 是保障 <a target="_blank"> 链接安全的「必备属性」,开发中应养成添加的习惯,避免因疏忽导致安全风险。

补充资料:

rel="noopener" 作为一项安全功能,其添加时间在不同浏览器和平台上有所不同。

在浏览器兼容性方面,据一些资料显示,Chrome 6.0(2010 年 9 月)、Firefox 4.0(2011 年 3 月)、Opera 11.1(2011 年 3 月)、Safari 5.0(2010 年 6 月)就开始支持 rel 属性,但当时可能并未完全明确其防范 window.opener 安全漏洞的功能。而 IE / Edge 12.0 则是在 2015 年 7 月开始支持。

从功能明确实现的角度来看,2016 年 11 月 23 日,rel="noopener" 作为安全修复程序被添加到 TinyMCE 插件中,WordPress 4.7.4 版本也随之更新了该功能。到 2019 年,Firefox 67 开始,当元素设置了 target="_blank" 属性后,会自动附加 rel="noopener" 的特性。Chrome 88 之后也更新了安全策略,默认 a 链接的 rel="noopener"。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端