相关文章推荐
温暖的西瓜  ·  国产汉堡包将出炉?入华27年的麦当劳卖给了中 ...·  11 月前    · 
独立的打火机  ·  一年花380元参加居民医保,到底值不值?—— ...·  1 年前    · 
伤情的红豆  ·  赵氏孤儿_百度百科·  1 年前    · 
稳重的哑铃  ·  Add custom tiles to ...·  1 年前    · 
想表白的烤土司  ·  苹果14手电筒灯不是白的 - 抖音·  2 年前    · 
小百科  ›  在新窗口中同弹出页面?小心蕴含着坑!-腾讯云开发者社区-腾讯云
线程 iframe
咆哮的葫芦
2 年前
作者头像
IMWeb前端团队
0 篇文章

在新窗口中打开页面?小心有坑!

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > IMWeb前端团队 > 在新窗口中打开页面?小心有坑!

在新窗口中打开页面?小心有坑!

作者头像
IMWeb前端团队
发布 于 2019-12-04 22:39:27
3.4K 0
发布 于 2019-12-04 22:39:27
举报

1. 背景

产品需求来啦:点击页面上某个东西,要在新窗口中打开一个页面,注意!要在新窗口中打开。你呵呵一笑,太简单了:

  1. 打开的页面地址是固定的?直接a标签加上 target="_blank" 属性搞定。
  2. 打开的页面地址是动态计算的?使用js进行 window.open(url) 搞定。

如果你人品比较好,你的页面可以顺利地运行到下线为止。但如果你脸比较黑,可能会遇到以下问题:

  1. 用户投诉:我在你们页面上进行的操作,怎么账号被盗了!!
  2. 用户吐槽:页面卡得不行了。。。

WTF?

2. 来两个例子

2.1 例子1:

步骤:

  1. 进入这个微博帖子页面: http://blog.sina.com.cn/s/blog_c3a321040102wdq4.html
  2. 点击正文的”点击有惊喜哦“链接。
  3. 看了下新打开的页面,什么惊喜都没有啊。。。回到上一个刚才的页面窗口。
  4. 嗯?登录态丢了,重新登录一下吧。
  5. 靠,中招了!

2. 例子2:

步骤:

  1. 使用chrome打开这个页面: http://coolriver.github.io/blog/pages/openerTest/origin.html , 你会看到有5个可点的链接,还有一个鬼畜的随机数。
  2. 点击第一个链接,也就是‘target _blank’字样的那个。
  3. 新页面显示'HACK成功,再看看上个TAB?'。然后你忍不住看回上一个页面。
  4. 看到第一行鲜红的提示:'你被HACK了啊!这个页面的地址已经变了!',同时,最下面一行的鬼畜随机数时不时地有些卡顿。

3. 新窗口中打开页面的问题

用简单地方式(背景中提到的)在新窗口中打开新页面会有一些问题。问题分为安全和性能两方面。机智的读者会发现上面的两个例子中分别复现了安全和性能问题(讲道理,第2个例子同时展现了安全和性能问题)

3.1 安全问题

使用a标签的 target="_blank" 属性,或者 window.open(url) 在新窗口中打开页面时,会存在潜在的安全问题。为什么呢?这个锅是一个叫 opener 的全局对象的锅。

回到例子1,可以自己动手尝试,在新打开的那个页面中,打开console, 输入 opener ,可以看到这个对象,正是打开本页面的父页面的窗口对象。如果父页面和新开窗口中的页面是不同 域名 的,浏览器会禁止新窗口访问opener中的内容。但是有一个操作除外:可以通过 window.opener.location = newURL 来重写父页面的url,即使与父窗口的页面不同域。

例子1就是利用这个方式,将父窗口的链接悄悄地替换成了钓鱼页面的地址。刚好父窗口的原始页面没有做防止被iframe嵌入,可以简单地通过iframe做一个极真实的钓鱼页面。如果不看url根本区分不出来是钓鱼页面(父窗口刚打开的时候好好的,谁会关注到这个url居然悄悄地变了呢?)

3.2 性能问题

除了安全问题,例子2中还展示了简单地在新窗口中打开页面的性能问题。源页面中鬼畜的随机数之所以会卡顿,也是受新打开的窗口中的页面影响。在例子2中,新页面中有一个定时器,每隔一段时间就有一个持续的循环,这个循环在阻塞新页面本身的js线程的同时,也阻塞了opener(也就是打开新页面的父窗口)里的js线程。如果再搞得狠一些,父窗口中的页面交互可以寸步难行。

为什么新窗口中的页面会影响父页面的线程呢?chrome不是每个标签页一个单独的进程?然后进程内包含若干线程吗?

确实,chrome有不同的标签页面使用不同进程和线程,但是有个例外,通过a标签的 target="_blank" 属性,或者 window.open(url) 在新窗口中打开页面, 会与父窗口共用进程和线程。为什么呢?还是因为opener。。。。因为opener里有DOM信息。两个进程中同时hold住了DOM信息,在多进程下很难道控制,所以干脆就放在一个进程里了。这个算是chrome的一个小缺陷(firefox也有,ie没有),不过chrome目前正在跟进和优化这里,详情可参考 这里 。

4. 解决方案

4.1 使用noopener属性

通过在a标签上添加这个noopener属性,可以将新打开窗口的opner置为空。特点:

  1. 可解决除IE外的安全问题,和所有现代浏览器的性能问题

4.2 window.open并设置opner为空

var otherWindow= window.open();
otherWindow.opener = null;
other = 'http://newurl';

特点:

  1. 可解决所有除safari外,所有浏览器的安全问题,无法解决性能问题

4.3 新建Iframe中打开新窗口,然后关掉iframe

特点:

  1. 可解决safari下的安全问题,无法解决性能问题

4.4 推荐方案

  1. 如果是a标签要在新窗口中打开,添加noopener属性
  2. 如果是js中打开新窗口,手动将新窗口的opener置为null
本文参与 腾讯云自媒体分享计划 ,分享自作者个人站点/博客。
原始发表:2016-12-11 , 如有侵权请联系 cloudcommunity@tencent.com 删除
php
安全
html

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

php
安全
html
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
关于作者
IMWeb前端团队
腾讯前端开发工程师
0
文章
0
累计阅读量
0
获赞
前往专栏
目录
  • 1. 背景
  • 2. 来两个例子
    • 2.1 例子1:
      • 2. 例子2:
      • 3. 新窗口中打开页面的问题
        • 3.1 安全问题
          • 3.2 性能问题
          • 4. 解决方案
            • 4.1 使用noopener属性
              • 4.2 window.open并设置opner为空
                • 4.3 新建Iframe中打开新窗口,然后关掉iframe
                  • 4.4 推荐方案
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2023 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
 
推荐文章
温暖的西瓜  ·  国产汉堡包将出炉?入华27年的麦当劳卖给了中国人 - 21财经
11 月前
独立的打火机  ·  一年花380元参加居民医保,到底值不值?——国家医保局有关司负责人就居民医保参保答记者问_ 本局要闻_ 福建省医疗保障局
1 年前
伤情的红豆  ·  赵氏孤儿_百度百科
1 年前
稳重的哑铃  ·  Add custom tiles to the app launcher - Microsoft 365 admin | Microsoft Learn
1 年前
想表白的烤土司  ·  苹果14手电筒灯不是白的 - 抖音
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号