a标签 target="_blank" 需要注意这些

摘要:
网页里的a标签默认在当前窗口跳转链接地址,如果需要在新窗口打开,需要给a标签添加一个target="_blank"属性。可以看到window.opener的一些属性,某些属性的访问被拦截,是因为跨域安全策略的限制。比如修改window.opener.location的值,指向另外一个地址。性能问题除了安全隐患外,还有可能造成性能问题。解决方案尽量不使用target="_blank",如果一定要用,需要加上rel="noopener"或者rel="noreferrer"。这样新窗口的window.opener就是null了,而且会让新窗口运行在独立的进程里,不会拖累原来页面的进程。

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

<a href="http://www.baidu.com"target="_blank">去百度</a>

安全隐患

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

a标签 target="_blank" 需要注意这些第1张

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

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

还有一种玩法,如果你处于登录状态,有些操作可能只是发送一个 GET 请求就完事了。通过修改地址,就执行了非你本意的操作,其实就是 CSRF 攻击。
性能问题
除了安全隐患外,还有可能造成性能问题。通过 target="_blank" 打开的新窗口,跟原来的页面窗口共用一个进程。如果这个新页面执行了一大堆性能不好的 JavaScript 代码,占用了大量系统资源,那你原来的页面也会受到池鱼之殃。
解决方案
尽量不使用 target="_blank" ,如果一定要用,需要加上 rel="noopener" 或者 rel="noreferrer"。这样新窗口的 window.opener 就是 null 了,而且会让新窗口运行在独立的进程里,不会拖累原来页面的进程。当然,有些浏览器对性能做了优化,即使不加这个属性,新窗口也会在独立进程打开。不过为了安全考虑,还是加上吧。
<div>这里是前一个页面</div>
<a href="http://www.baidu.com"target="_blank"rel="noreferrer">去百度</a>

a标签 target="_blank" 需要注意这些第2张

另外,对于通过 window.open 的方式打开的新页面,可以这样做:
var yourWindow =window.open();
yourWindow.opener = null;
yourWindow.location = "http://someurl.here";
yourWindow.target = "_blank";

转载:网页外链用了 target="_blank",结果悲剧了

免责声明:文章转载自《a标签 target="_blank" 需要注意这些》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu上交叉编译valgrind for Android 4.0.4的过程与注意事项mysql 个人博客应用的建表和相关查询下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

easyui datagrid 自定义editor

1 $.extend($.fn.datagrid.defaults.editors, { 2 mycombogrid: { 3 init: function (container, options) { 4 var input = $('<input type="te...

Jenkins 五: 构建Ant项目

1. 点击“新建”,在“Item名称”栏输入要构建的项目名,比如“Ant_project”,选择“构建一个自由风格的软件项目”,点击“OK”按钮。 2. 找到“源码管理”-> “Subversion”. 在 “Repository URL”栏输入源码地址。 3. 找到“ 构建”。点击 “增加构建步骤”,选择”Invoke Ant”。 在“Ant Ve...

Informatica 简单使用

1. Informatica简介 ① Repository manager 主要用来维护资料库的目录,对象,建完对象可以创建demo的folder。 ② Administration Console是完全基于web的,管理所有的节点,服务,在里面包括资料库的一些用户,权限等信息。 ③ Designer主要用来设计mapping。Mapping是inform...

ubuntu 18.04, 编译运行ORB_SLAM3, 遇到错误Pangolin X11: Unable to retrieve framebuffer options。

当前问题 遇到错误Pangolin X11: Unable to retrieve framebuffer options。操作系统是ubuntu 18.04,物理机,不是虚拟机. 按报错Pangolin X11: Unable to retrieve framebuffer options ,修改components/pango_windowing/sr...

Unity3D中Mathf数学运算函数总结

引入: 看到一个案例注意到函数Mathf.SmoothDamp的使用,游戏中用于做相机的缓冲跟踪和boss直升机跟踪士兵。该函数是Unity3D中Mathf数学运算函数中的一个。一些游戏使用了smoothmove的功能,其实就是类似的效果,只是发现这个函数很容易的已经封装好了,查了官网文档发现使用起来真的非常简单。 smoothdamp,我的理解是平滑缓...

Vue.set()和this.$set()源码解析

前言 我们在日常项目开发过程中,有时候我们对数组或者对象进行了一些操作后,发现页面数据没有更新到。这个时候就会有疑问,why? 如果我们在看文档有这样一个api,以下内容: Vue.set()和this.$set()实现原理 Vue.set()的源码:... 这里是省略的代码 import { set } from '../observer/index'...