HTML a标签打开新标签页避免出现安全漏洞,请使用“noopener”

news2024/9/22 21:12:49

新标签页中打开一个网址如何出现安全漏洞

让我们在网站上的新标签页中打开一个网址,HTML如下

<a href="https://malicious-domain.netlify.com" target="_blank">访问恶意网站!
</a> 

这里我们有一个指向恶意网站的 href 属性,并以 _blank 属性为 target,使其在新标签页中打开。

该流程看起来如此简单明了,用户在这里可能面临的安全风险是什么?

用户从你的页面重定向到域,此时,浏览器会将你当前网站的所有 window 变量内容附加到恶意网站的 window.opener 变量。现在恶意网站可以访问你网站的 window,这显然在重定向此方法时打开了一个安全漏洞

恶意网站一旦通过 window.opener 访问了你的网站的 window 变量,它可以将你之前的网站重定向到一个新的钓鱼网站,这个网站可能与你打开的实际网站相似,甚至可能会要求你再次登录。

在恶意网站中,只需编写以下代码即可完成上述修改

if (window.opener) {window.opener.location = 'https://www.dhilipkmr.dev';
} 

因此,无辜用户将陷入此陷阱,并提供可能暴露给攻击者的登录详细信息。

我们如何避免这种情况?

一种简单的方法是将带有 noopenerrel 属性添加到 <a> 标记。

<a href="https://malicious-domain.netlify.com" rel="noopener" target="_blank">访问恶意网站!
</a> 

它有什么作用?

rel = "noopener" 表示浏览器不要将当前网站的 window 变量附加到新打开的恶意网站。

这使得恶意网站的 window.opener 的值为 null

因此,在将用户导航到你未维护的新域时,请当心。

并非总是我们用标签打开一个新标签,在某些情况下,你必须通过执行javascript的 window.open() 来打开它,如下所示:

function openInNewTab() {// 一些代码window.open('https://malicious-domain.netlify.com');
} 
<span class="link" onclick="openInNewTab()">访问恶意网站!</span> 

这里没有提及 noopener,因此这导致当前网站的 window 传递到恶意网站。

通过js打开新标签页时,该如何处理?

function openInNewTabWithoutOpener() { var newTab = window.open(); newTab.opener = null; newTab.location='https://malicious-domain.netlify.com';
 } 
<span class="link" onclick="openInNewTabWithoutOpener()">访问恶意网站!</span> 

我们已经通过 window.open() 打开了一个虚拟标签,该标签打开了 about:blank,因此这意味着它尚未重定向到恶意网站。

然后,我们将新标签的 opener 值修改为 null

将我们将新标签的网址修改为恶意网站的网址。

这次,opener 再次为空,因此它无法访问第一个网站的 window 变量。

问题解决了。

但是在旧版本的Safari中将无法使用此方法,因此我们再次遇到问题。

如何解决Safari的问题?

function openInNewTabWithNoopener() {const aTag = document.createElement('a');aTag.rel = 'noopener';aTag.target = "_blank";aTag.href = 'https://malicious-domain.netlify.com';aTag.click();
} 
<span class="link" onclick="openInNewTabWithoutOpener()">访问恶意网站!</span> 

在这里,我们模拟点击锚标记。

  • 我们创建 <a> 标记并分配所需的属性,然后在其上执行 click(),其行为与单击链接相同。
  • 不要忘记在此处向标签添加 rel 属性。

其他事实:

  • 当您在锚标记上单击 CMD + LINK 时,Chrome,Firefox和Safari会将恶意网站的 window.opener 视为 null
  • 但是,在通过JavaScript处理新标签页打开的元素上的 CMD + LINK 上,浏览器将附加窗口变量并将其发送到新标签页。
  • 默认情况下,新版的Safari会在所有情况下删除 window.opener,要将窗口信息传递给新的标签页,你必须明确指定 rel='opener'

没有人可以绕过你的"保安"。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当malloc为string等容器开内存时候产生的问题,malloc和new最本质的区别

报内存错误的代码: 顺利执行的代码: 可以看到在malloc为a开好空间&#xff0c;然后对自定义类型对象a中的string a成员进行赋值的时候&#xff0c;发生了内存错误&#xff0c;但是经过测试&#xff0c;使用new为string a开空间就不会发生错误; new和malloc最本质的区别 最主要…

uniCloud云开发----6、uniapp配置tabbar底部导航栏和去掉uni-app顶部标题

uniapp配置tabbar底部导航栏、去掉uni-app顶部标题前言效果图1、创建页面并声明注册2、配置pages.json--tabBar3、通过pages.json来去掉uni-app顶部标题全部页面都去掉单个页面去掉前言 tabbar文档 在 pages.json 中提供 tabBar 配置&#xff0c;不仅仅是为了方便快速开发导航…

Elasticsearch入门,持续更新中

目录elasticsearch简介elasticsearch下载问题分析解决启动可视化界面Kibana下载配置启动进入kibana的控制台elasticsearch简介 懂得都懂 elasticsearch下载 官网下载地址 链接: https://www.elastic.co/cn/downloads/elasticsearch 本人准备安装在win10上&#xff0c;本地…

IB学习阶段所需的教材有哪些?

IB课程即国际文凭组织IBO&#xff08;International Baccalaureate Organization&#xff09;&#xff0c;是为全球学生开设从幼儿园到大学预科的课程&#xff0c;为3-19岁的学生提供智力&#xff0c;情感&#xff0c;个人发展&#xff0c;社会技能等方面的教育&#xff0c;使其…

可以同时解析多个binlog吗

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 叶金荣文章来源&#xff1a;GreatSQL社区原创 1.可以同时解析多个binlog吗 2.innodb_buffer_pool_instances设…

【C语言进阶】指针的进阶(1)

作者:匿名者Unit 目录一.数组指针1.定义2.使用二.数组、指针传参1.一维数组传参2.二维数组传参3.一级指针传参4.二级指针传参三.函数指针一.数组指针 1.定义 数组指针&#xff0c;顾名思义是指向数组的指针&#xff0c;那数组指针是如何定义的呢 int (*p)[10]; //解释&#x…

JavaSE从基础到入门:异常的学习

1. 异常的概念与体系结构 1.异常的概念 异常&#xff08;Exception&#xff09;指不期而至的各种状况&#xff0c;异常发生的原因有很多&#xff0c;通常包含以下几大类&#xff1a; 用户输入了非法数据。要打开的文件不存在。网络通信时连接中断&#xff0c;或者JVM内存溢出…

HDMI1.4/2.0 Subsystem官方例程的建立

HDMI1.4/2.0 Subsystem官方例程的建立1、 项目背景明德扬(MDY)为某研究所研制的视频接口转换模块&#xff0c;该模块将HDMI视频转成LVDS7:1视频。视频输入接口采用的是HDMI 4K输入&#xff0c;基于Xilinx K7325t的高速收发器,特点是无需外围HDMI接收芯片&#xff0c;大大简化了…

SpringBoot+VUE前后端分离项目学习笔记 - 【13 SpringBoot和Vue实现导入和导出】

hutool工具 引入Hutool工具使用ExcelWriter&#xff0c;可以将数据写出到EXCEL https://www.hutool.cn/docs/#/poi/Excel%E5%B7%A5%E5%85%B7-ExcelUtil 引入pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactI…

项目中不容忽视的图表报表

在项目工作中&#xff0c;报表可是少不了的好帮手&#xff0c;可以帮助我们向合作者以及领导直观地展示项目情况进展。项目报表的作用可以从多维度监控项目的运行&#xff0c;保障项目的顺利进行。让数据可视化&#xff0c;辅助管理者进行合理决策。及时与合作者共享项目信息&a…

使用ros从realsence相机中获取图像

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、使用ros从realsence相机中获取录制的视频并播放1.开启ros内核2.打开realsense相机3.查看当前话题4.在相机界面显示RGB图像和depth图像4.1 添加Image4.2 填入…

智能高效的Go IDE——GoLand v2022.3全新发布

GoLand使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

javac和java命令详解

javac 是java语言编程编译器。全称java compiler。相信大家在学习java编程的时候&#xff0c;一定使用过javac和java这两个命令。大家在安装JDK的时候&#xff0c;验证是否安装成功&#xff0c;都会在命令行里输入java和javac命令来验证&#xff0c;这就是我们第一次使用java和…

PDF怎么编辑注释? 5 个免费好用的 PDF 注释器

成群结队的人和组织想要注释他们的 PDF 文档的原因有很多。无论哪种情况&#xff0c;目标是做到近乎完美并不是完美。但是&#xff0c;如果您没有合适的 PDF 注释器&#xff0c;这又是不可能的。虽然这些 PDF 注释器工具中的许多都很昂贵&#xff0c;但您仍然可以使用免费的 PD…

tkintertools 模块实战一:任务清单小工具

之前我自己写了一个 tkinter 模块的辅助模块 —— tkintertools&#xff0c;这次试着用这个模块开发了一款可以记录任务的小工具&#xff0c;应该会比较实用。tkinter 模块的最强辅助模块 —— tkintertools&#xff08;万字详解&#xff09;_小康2022的博客-CSDN博客tkinter 模…

数字图像处理实验(直方图均衡化规定化)

图像均衡化 图像均衡化是一种图像处理技术&#xff0c;它的目的是改善图像的对比度。 具体来说&#xff0c;对于一张图像&#xff0c;其直方图就是统计图像中各灰度级出现的次数的图像。通常情况下&#xff0c;图像的直方图会呈现不平衡的状态&#xff0c;即图像的某些灰度级出…

SQLSERVER 的主键索引真的是物理有序吗?

一&#xff1a;背景 1. 讲故事 最近在看 SQL SERVER 2008 查询性能优化&#xff0c;书中说当一个表创建了聚集索引&#xff0c;那么表中的行会按照主键索引的顺序物理排列&#xff0c;这里有一个关键词叫&#xff1a;物理排列&#xff0c;如果不了解底层原理&#xff0c;真的…

5G NR标准: 第18章 射频特性

第18章 射频特性 如第 3 章所述&#xff0c;NR 的射频特性与 5G 的可用频谱以及在这些频谱分配中运行所需的频谱灵活性密切相关。 虽然频谱灵活性一直是前几代移动系统的基石&#xff0c;但对于 NR&#xff0c;这一点变得更加突出。 它由几个组成部分组成&#xff0c;包括在不…

C++11 线程异步

文章目录1. 线程异步的概念2. future2.1 共享状态2.2 常用成员函数3. promise3.1 常用成员函数3.2 promise的基本使用4. package_task4.1 常用成员函数4.2 package_task的基本使用5. async5.1 async的基本使用6. promise、package_task、async的对比与总结1. 线程异步的概念 问…

干货 | 读懂 Appium 日志,让测试效率翻倍!

Appium 服务器运行时会产生很多日志&#xff0c;但是很多人并不了解其中的意义&#xff0c;也无法掌握有用的信息。本文将详细解读如何读懂 Appium 日志&#xff0c;并让你的测试效率翻倍。开启服务日志第一行显示了 Appium 版本和运行地址。$ appium[Appium] Welcome to Appiu…