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"

相关推荐
Web极客码20 小时前
WordPress 6.8有哪些新特性
前端·javascript·html
UXbot1 天前
UI设计工具推荐合集
前端·人工智能·ui
敲敲了个代码1 天前
如何优化批量图片上传?队列机制+分片处理+断点续传三连击!(附源码)
前端·javascript·学习·职场和发展·node.js
@AfeiyuO1 天前
Vue 引入全局样式scss
前端·vue·scss
光影少年1 天前
flex布局和grid布局区别,实现两边固定布局中间自适应
前端·css3·web·ai编程
全栈测试笔记1 天前
异步函数与异步生成器
linux·服务器·前端·数据库·python
EndingCoder1 天前
配置 tsconfig.json:高级选项
linux·前端·ubuntu·typescript·json
木风小助理1 天前
JavaStreamAPI的性能审视,优雅语法背后的隐形成本与优化实践
java·前端·数据库
white-persist1 天前
轻松抓包微信小程序:Proxifier+Burp Suite教程
前端·网络·安全·网络安全·微信小程序·小程序·notepad++
敲敲了个代码1 天前
多标签页强提醒不重复打扰:从“弹框轰炸”到“共享待处理队列”的实战
java·前端·javascript·面试·架构