日,CyberArk安全研究员Eviatar Gerzi发现Windows终端和基于Chrome的网页浏览器上存在多个高危DoS(拒绝服务)漏洞。
Gerzi在2003年的一个通过修改窗口标题执行代码的旧安全公告(https://marc.info/?l=bugtraq&m=104612710031920&q=p3)尝试了各种潜在的滥用途径,并发现了一种在PuTTY上诱导快速窗口标题更改的方法。
这种非典型的攻击方式导致测试设备进入一种被称为“白屏死机”的状态,除了鼠标光标外,屏幕上所有的应用程序界面都冻结了(失去响应)。
研究人员对存在类似漏洞的本地应用程序的实施攻击后,导致程序调用过多的操作系统内核,系统立即进入白屏死机状态。
被滥用的函数是“SetWindowText”,可用于更改指定窗口标题栏的文本。
需要注意的是,这个简单的攻击技巧可以导致大量“无辜”应用程序也一并被拖入白屏死机状态,而摆脱白屏死机状态的唯一方法是重新启动计算机。
研究人员还发现,“SetWindowText”并不是唯一导致白屏死机的手段,在其中一个案例中,研究人员测试了MobaXterm终端,令我惊讶的是它没有使用SetWindowText函数来更改窗口标题,而是使用了一个名为GdipDrawString的函数。
在这种情况下,有趣的是GdipDrawString并没有像SetWindowText那样导致整个计算机失去响应。它只影响了最终崩溃的应用程序。
Gerzi确认以下Windows终端受到白屏死机漏洞的影响:
主流浏览器未能幸免
意识到几乎所有的GUI图形界面应用程序都使用SetWindowText函数,研究人员尝试了针对Chrome等流行的网络浏览器的攻击。
研究人员创建了一个HTML文件,该文件会导致标题在无限循环中快速变化,从而迫使浏览器冻结。
结果Edge、Torch、Maxthon、Opera和Vivaldi等所有基于Chromium的主流浏览器,全部中招,失去响应,而Firefox和Internet Explorer虽然没有瘫痪,但性能也受到了影响。
由于现代浏览器都是基于沙盒技术,因此滥用SetWindowText函数并不会影响到底层操作系统,让整个系统白屏死机。但是,当研究者尝试在虚拟机内进行浏览器攻击时,会出现资源耗尽问题,导致虚拟化系统显示“蓝屏死机”。
厂商回应:不是漏洞
研究人员指出,除了实验已经验证的Windows终端模拟器和主流浏览器以外,任何使用SetWindowText或GdipDrawString函数的应用程序都可能受此攻击影响。
有些应用例外,例如Slack。像Slack这样的应用程序在函数调用上具有速率限制器,因此它们能够抵御这种DoS攻击。
Gerzi联系了受影响的供应商并收到以下回复:
虽然谷歌和微软都否认白屏死机是漏洞,但是安全研究人员指出,可以通过在远程服务器上创建恶意文件并从在存在漏洞的终端中打开来远程触发攻击。
、首先说说浏览器的加载流程:
(1) 用户在地址栏中打开一个URL,浏览器首先会寻找该URL所在服务器,通过DNS服务器查询浏览器会获
得该URL所在网站的IP地址,然后向该地址发起请求,连接到服务器;
(2) 建立连接后,向服务器发送http请求,请求对应的HTML文档;
(3) 解析HTML文档,目的是知道该页面需要哪些资源以及生成DOM树;生成DOM树和获取到相应需要的
资源文件同时进行;解析HTML文档时,一旦发现一个标签,就会根据标签的要求分配对指定的资源进行下载,当DOM树生成后,DOMContentLoaded事件被触发;
理论上浏览器并行下载页面所需要的资源会带来更好的性能体验!
(4) Onload事件,当解析完成后,生成了DOM树,所有页面需要的资源文件都已经成功下载和执行后,
浏览器会发出Onload事件并回调HTML文档中的onload函数。
2、对于优化页面速度的必要性:
页面的打开速度对于网站的优化有极大的意义,如果打开一个页面长时间处于白屏状态,如果超过5s,暴脾气
的我是会直接关闭这个网页;或者是页面加载出来了,但是比较慢,页面显示不完整,标签一直在转圈,页面处于不可交互状态,这也是一种很不好的体验;
一个页面的打开速度快不快,可以用两个指标来描述,一个是ready时间,一个是load时间,chrome控制台可以看到;
一共是加载了19.2KB,ready时间是133ms,load时间是147ms;
3、分点介绍优化策略:
(1) 避免head标签js堵塞:
所有放在head标签里面的js和css都会堵塞渲染;如果这些css和js需要加载很久的话,那么页面就空白了;
[html] view plain copy
<head>
<title>test</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
用google的cdn加载一个jQuery文件是访问不了的,所以标签一直在转圈,页面没有任何显示;
有两种解决办法,第一种是把script放到body后面,这也是很多网站采取的方法。第二种是给script加defer或者async的属性,一旦script是defer或者async延迟的,那么这个script将会异步加载,但不会马上执行,会在readystatechange变为Interactive后按顺序依次执行;
两者相同点:
加载文件时不阻塞页面渲染
对于inline的script无效
使用这两个属性的脚本中不能调用document.write方法
有脚本的onload的事件回调
两者不同点:
async下,js一旦下载好了就会执行,所以很有可能不是按照原本的顺序来执行的。如果js前后有依赖性,用async,就很有可能出错。
如果一个script加了defer属性,即使放在head里面,它也会在html页面解析完毕之后再去执行,也就是类似于把这个script放在了页面底部。
(2) 减少head里面的css资源:
css必须放在head标签里面,如果放在body里面会造成对layout好的dom进行重排造成页面闪烁;但是一旦
放在head标签里面又会堵塞页面渲染;所以要尽可能的减小css体积;
例:不要放太多base64在css里面,webpack构建工具常常会配置图片体积小于多少的直接转换成base64加载,这
里是挺影响性能的,一个是不能用到缓存机制,另一个就是加大了css的体积;个人建议上线项目直接把图片用cdn托
管;
在这里给大家推荐一个前端交流学习qun,想要学习的朋友可以加入进来,免费带你入门。前面是554,中间是224,后面是926.
(3)延迟加载图片:
对于很多网站来说,图片汪汪是占用最多流量和带宽的资源;
[html] view plain copy
<span style="font-size:18px;"><body>
<img id="imgTest" src="about:blank" data-src="1.gif" />
</body>
<script type="text/javascript">
window.onload=function(){
$("#imgTest").attr("src",$("#imgTest").data("src"));
}
</script></span>
这里没有直接给src路径,而是在页面加载完成后用js操作src,减少了页面加载图片的时间,首先把整个页面结构呈现给用户;惰性加载图片也是差不多;当用户滑动页面到一定高度时(监听scroll事件),再动态的依次对图片进行处理;
(4) 压缩和缓存:
压缩就不说了;缓存会在后续文章中具体写一个demo,持续更新;
(5) DNS解析优化:
DNS查询需要花费大量时间来返回一个主机名的IP地址;
在我们的网站中,可能会加载到很多个域的东西,比如引入了百度地图啊之类的sdk和一些自己的子域名服务;第一次打开网站时要做很多次DNS查找;DNS预读取能够加快网页打开时间;
[html] view plain copy
<link rel="dns-prefection" href="https://www.baidu.com">
在head中写上几个link标签,对标签中的地址提前解析DNS,这个解析是并行发生的,不会堵塞页面渲染;
还有非常多的页面优化技巧,html别嵌套太多层,加重页面layout的压力;css选择器的合理运用,减少匹配的计算量;js中别滥用闭包,会加深作用域链,增加变量查找时间;减少http请求之类的等等;
我是一名前端开发程序员,自己整理了一份2019最全面前端学习资料,从最基础的HTML+CSS+JS到移动端HTML5到各种框架都有整理,送给每一位前端小伙伴,这里是小白聚集地,欢迎初学和进阶中的小伙伴
前端资料获取方式:
1.在你手机的右上角有【关注】选项,点击关注!
2.关注后,手机客户端点击我的主页面,右上角有私信,请私信回复:【学习】
电脑已经设置好了关键词自动回复,所以回复的时候请注意关键词哟~
场诗
曲木为直终必弯,养狼当犬看家难; 墨染鸬鹚黑不久,粉刷乌鸦白不天。 蜜饯黄莲终需苦,强摘瓜果不能甜; 好事总得善人做,哪有凡人做神仙。
前言
该篇文章会为您分享在前端性能优化中非常重要的一环-白屏时间,将从白屏时间的概念、重要性以及白屏的过程一一进行阐述,同时提供性能优化的策略与实践。
一、概念
白屏时间:即用户点击一个链接或打开浏览器输入URL地址后,从屏幕空白到显示第一个画面的时间。
白屏时间的长短将直接影响用户对该网站的第一印象。
二、白屏时间的重要性
当用户点开一个链接或者是直接在浏览器中输入URL开始进行访问时,就开始等待页面的展示。页面渲染的时间越短,用户等待的时间就越短,用户感知到页面的速度就越快。这样可以极大的提升用户的体验,减少用户的跳出,提升页面的留存率。
打开一个页面就像你的女票召唤你一样,你出现的越迅速,女票肯定会愈加欣喜!反之,你千呼万唤始出来,那么你的女票很可能又要抛弃你了(为什么要对你说又呢? ...)
三、白屏是一个怎样的过程呢?
让我们一起来揭秘:从打开一个页面,到页面的画面展示经历了怎样的过程!
1. DNS Lookup
DNS Lookup 即浏览器从DNS服务器中进行域名查询。
浏览器会先对页面进行域名解析,获取到服务器的IP地址后,进而和服务器进行通信。
Tips: 通常在整个加载页面的过程中,浏览器会多次进行DNS Lookup,包括页面本身的域名查询以及在解析HTML页面时加载的JS、CSS、Image、Video等资源产生的域名查询。
2. 建立TCP请求连接
浏览器和服务端TCP请求建立的过程,是基于TCP/IP,该协议由网络层的IP和传输层的TCP组成。IP是每一台互联网设备在互联网中的唯一地址。
TCP通过三次握手建立连接,并提供可靠的数据传输服务。
3. 服务端请求处理响应
在TCP连接建立后,Web服务器接受请求,开始进行处理,同时浏览器端开始等待服务器的处理响应。
Web服务器根据请求类型的不同,进行相应的处理。静态资源如图片、CSS文件、静态HTML直接进行响应;如其他注册的请求转发给相应的应用服务器,进行如数据处理、缓存中取数据,将数据按照约定好的格式响应给浏览器。
在大型应用中,通常为分布式服务架构,应用服务器的处理有可能经过很多个系统的中间件,最终获取到需要的数据
4. 客户端下载、解析、渲染显示页面
在服务器返回数据后,客户端浏览器接收数据,进行HTML下载、解析、渲染显示。
浏览器下载HTML后,首先解析头部代码,进行样式表下载,然后继续向下解析HTML代码,构建DOM树,同时进行样式下载。当DOM树构建完成后,立即开始构造CSSOM树。理想情况下,样式表下载速度够快,DOM树和CSSOM树进入一个并行的过程,当两棵树构建完毕,构建渲染树,然后进行绘制。
Tips:浏览器安全解析策略对解析HTML造成的影响:
一定要合理放置JS代码!!!
四、白屏-性能优化
至此,我们已经了解了从浏览器在打开一个链接开始,到屏幕展示的过程-白屏时间的历程,那这对每个环节中发生的事情,我们可以有针对性的进行相关的优化。
1. DNS解析优化
针对DNS Lookup环节,我们可以针对性的进行DNS解析优化。
2. TCP网络链路优化
针对网络链路的优化,好像除了花钱没有什么更好的方式!
3. 服务端处理优化
服务端的处理优化,是一个非常庞大的话题,会涉及到如Redis缓存、数据库存储优化或是系统内的各种中间件以及Gzip压缩等...
4. 浏览器下载、解析、渲染页面优化
根据浏览器对页面的下载、解析、渲染过程,可以考虑一下的优化处理:
声明
本文为胡哥拜读周涛明、张荣华、张新兵几位大佬所著《大型网站性能优化实战》一书并结合自身经验所得,愿对诸位小伙伴有所帮助。手动微笑.gif
后记
以上就是胡哥今天给大家分享的内容,喜欢的小伙伴记得收藏、转发、点击右下角按钮在看,推荐给更多小伙伴呦,欢迎多多留言交流...
胡哥有话说,一个有技术,有情怀的胡哥!京东开放平台首席前端攻城狮。与你一起聊聊大前端,分享前端系统架构,框架实现原理,最新最高效的技术实践!
长按扫码关注,更帅更漂亮呦!关注胡哥有话说公众号,可与胡哥继续深入交流呦!
*请认真填写需求信息,我们会在24小时内与您取得联系。