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

作者 : 开心源码 本文共1458个字,预计阅读时间需要4分钟 发布时间: 2022-05-13 共212人阅读

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

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

<a href="http://kaysonli.com/" target="_blank">1024译站</a>

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

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

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

安全隐患

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

image.png

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

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

phishing.jpg

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

性能问题

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

处理方案

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

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

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

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

更多前台技术干货尽在微信公众号:1024译站

微信公众号:1024译站

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 网页外链用了 target="_blank",结果悲剧了

发表回复