来自公众号:1024译站

今天给大家分享一个 Web 知识点。如果你有过一段时间的 Web 开发经验,可能已经知道了。不过对于刚接触的新手来说,还是有必要了解一下的。

我们知道,网页里的a标签默认在当前窗口跳转链接地址,如果需要在新窗口打开,需要给 a 标签添加一个target="_blank"属性。

1024译站

顺便提下一个有意思的现象,很早之前我就发现,国外网站倾向于在当前页跳转,而国内网站喜欢打开新窗口。不信你们可以去验证下。我不知道这是交互设计上的文化差异,还是技术上的开发习惯。

当然,这两种方式各有优缺点。当前页跳转显得操作比较有连贯性,不会贸然打断用户的注意力,也会减少浏览器的窗口(tab 页)数量。但是对于需要反复回到初始页面的场景来说,就很麻烦了。比如搜索结果页面,通常需要查看对比几个目标地址,保留在多个窗口还是比较方便。

今天要说的不只是用户体验上的差别,而是涉及安全性能

安全隐患

如果只是加上target="_blank",打开新窗口后,新页面能通过window.opener获取到来源页面的window对象,即使跨域也一样。虽然跨域的页面对于这个对象的属性访问有所限制,但还是有漏网之鱼。

这是某网页打开新窗口的页面控制台输出结果。可以看到window.opener的一些属性,某些属性的访问被拦截,是因为跨域安全策略的限制。

即便如此,还是给一些操作留下可乘之机。比如修改window.opener.location的值,指向另外一个地址。你想想看,刚刚还是在某个网站浏览,随后打开了新窗口,结果这个新窗口神不知鬼不觉地把原来的网页地址改了。这个可以用来做什么?钓鱼啊!等你回到那个钓鱼页面,已经伪装成登录页,你可能就稀里糊涂把账号密码输进去了。

还有一种玩法,如果你处于登录状态,有些操作可能只是发送一个GET请求就完事了。通过修改地址,就执行了非你本意的操作,其实就是 CSRF 攻击。

性能问题

除了安全隐患外,还有可能造成性能问题。通过target="_blank"打开的新窗口,跟原来的页面窗口共用一个进程。如果这个新页面执行了一大堆性能不好的 JavaScript 代码,占用了大量系统资源,那你原来的页面也会受到池鱼之殃。

解决方案

尽量不使用target="_blank",如果一定要用,需要加上rel="noopener"或者rel="noreferrer"。这样新窗口的window.openner就是null了,而且会让新窗口运行在独立的进程里,不会拖累原来页面的进程。不过,有些浏览器对性能做了优化,即使不加这个属性,新窗口也会在独立进程打开。不过为了安全考虑,还是加上吧。

我特意用自己的博客网站 http://www.kaysonli.com/ 试了一下,点击里面的外链打开新页面,window.openner都null。查看页面元素发现,a标签都加上了 rel="noreferrer"。博客是用 Hexo 生成的,看来这种设置已经成了基本常识了。

另外,对于通过window.open的方式打开的新页面,可以这样做:

var yourWindow = window.open();yourWindow.opener = null;yourWindow.location = "http://someurl.here";yourWindow.target = "_blank";

希望这个小技巧对你有用。

架构师精选

如何限制iframe内网页打开新窗口_网页外链用了 target=quot;_blankquot;,结果悲剧了...相关推荐

  1. iframe 禁止打开新窗口_打开新窗口的安全和性能问题

    相信大部分同学都接到过"点击页面某个地方从新窗口打开一个页面"的需求, 一般这个需求都有一下两种处理方式来完成: 1. a标签加上target="_blank" ...

  2. java通过按钮打开新窗口_如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。...

    JButton btn=new JButton(new AbstractAction("关闭并打开") {      @Override   public void actionP ...

  3. javafx 打开新窗口_新的JMetro JavaFX 11兼容版本

    javafx 打开新窗口 你好,我们又见面了! 这次,新版本与JavaFX 11兼容. 继续阅读以获取详细信息. JMetro 8.5.7和11.5.7版本 JMetro代码已分为2个分支. mast ...

  4. 网页打开新窗口——Window.open()详解

    [html] view plain copy Window.Open详解 一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Oper ...

  5. window.location.href不打开新窗口_嘿,这条微博值得一看:不登录如何访问页面

    简单解释一下:有些网站需要登录才能浏览里面的页面,但搜索引擎的爬虫不需要登录也可以访问,所以你只要简单设置一下浏览器,让这个网站以为你就是那只搜索引擎的爬虫就可以了. 设置方法: 打开 Chrome ...

  6. window.open 不打开新窗口_关闭四十年的“新窗口”,由谁打开?

    历史是有趣的,有时候时势造英雄,英雄却无用武之地.偏振测量是X射线天文学最早探索的方向之一,却成为最晚打开的窗口.守得住四十年的寂寞,是因为期盼云开月明的一天.这四十年发生了什么,又有何感悟? (图源 ...

  7. iframe 禁止打开新窗口_教育部新政策:禁止中学生复读?

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注.注:本文转载自网络,如有侵权,请联系删除 在学生阶段 ...

  8. python关闭当前窗口 打开新窗口_关闭窗口,用PyQ在Python中打开一个新窗口

    我是PyQt5新手,想编写一个小程序 我在QT设计器中设计了两个窗口,并将它们转换成py脚本. 后来我把两者合并成一个文件(也许我的尝试完全错了-所以请纠正我) 当程序启动时,我会看到一个小窗口,上面 ...

  9. 打开新窗口的几种方式及target=_blank指定窗口名称

    打开新窗口的几种方式及target=_blank指定窗口名称   打开新窗口的几种方式: 1.form提交到新窗口  <form action="action.jsp" ta ...

最新文章

  1. TCP丢包检测技术详解
  2. 吴恩达 coursera ML 第十二课总结+作业答案
  3. 赋值运算符函数严谨性的几点思考
  4. c++ 指针拼接字符串_字符串拼接+和concat的区别
  5. 阿里云搭建流媒体服务器
  6. session保存密码_年薪百万之路--第六十四天 Cookie操作与session操作
  7. MySQL utf8mb4字符集配置,支持emoji表情存储
  8. 51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释...
  9. linux中文显示和输入
  10. 使用SQL语句创建数据库
  11. 2022爱分析·营销服务一体化实践报告
  12. knockout select默认选中
  13. 中国大陆新身份证号码算法
  14. 开源机器人库orocos KDL 学习笔记(二):Geometric
  15. LNMP+coreseek(sphinx+mmseg3)搭建全文索引库_sgk
  16. 网络接口层协议:ATM
  17. 开发一个最简单的iOS App
  18. yum命令的基本用法
  19. php应用于哪些地方,php的应用范围
  20. windows硬盘linux无法挂载,关于linux:Ubuntu无法挂载Windows硬盘甚至Windows在双启动时正常关闭...

热门文章

  1. 周末项目:使用scikit-learn进行手语和静态手势识别
  2. Tushare在R中的使用
  3. rabbitmq实战_RabbitMQ实战(四) - RabbitMQ amp; Spring整合开发
  4. python分析BOSS直聘的某个招聘岗位数据
  5. Python操作数据库(二)
  6. pycharm中的数据库可视化
  7. sklearn 常用模块及类与方法
  8. 王道 —— 进程的定义、组成、组织方式、特征
  9. 【例题+习题】【数值计算方法复习】【湘潭大学】(七)
  10. 双稀疏主题模型(Dual-Sparse Topic Model)编程实现中的细节 Java