速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

12 行 JS 代码的 DoS 攻击分析及防御

  • 2016-03-31
  • 本文字数:2078 字

    阅读完需:约 7 分钟

有一段 12 行的 JavaScript 代码,可以让 Firefox、Chrome、Safari 浏览器崩溃,而且还能让 iPhone 重启、安卓闪退,本文作者对这 12 行代码进行了分析解读并且提出了相应的防御办法,欢迎大家一同探讨。

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 等多种版本。

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,循环了 1,000,000 次,不停的向历史记录堆栈中新增记录,会导致 CPU 和内存占用率过高以及 Firefox,Chrome,Safari 浏览器崩溃,而且还能让 iPhone 重启。

分析结果

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

  • 当上面那个循环次数为十万以上级别的时候,CPU,内存使用率瞬间 100%,然后崩溃死机;
  • 当上面那个循环次数缩小到 10000 左右的时候,CPU,内存使用率大概在 20 秒内逐渐升高至 100%,然后崩溃死机;
  • 当上面那个循环次数缩小到 500 左右的时候, CPU 使用率逐渐升高到达 100% 后,再次瞬间恢复到稳定状态,内存使用从 130M 左右升高至 230M 左右,而打开的 192.168.56.106/12.html 这个页面后,地址栏里面的链接也变成了:192.168.56.106/0123456789101112131415161718192021……494495496497498499

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

相关的防御

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

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

当然,互联网充满着信息安全威胁,网络安全防护,七分靠技术,三分靠意识,要防护这些问题,单纯依靠安全厂商的产品和服务是远远不够的,网络安全意识的提高不可忽视。

比如:注意个人密码的管理、注意个人隐私的保护、不要轻易接入公共的 wifi、不要轻易相信陌生 / 熟悉朋友的链接或者文件等、注意移动支付的安全、不要让设备“裸奔”等等。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-03-31 17:254099

评论

发布
暂无评论
发现更多内容

ElasticSearch三节点集群搭建笔记(中心化版本)

爱好编程进阶

程序员 后端开发

全球最大的半导体IP产业链,你了解多少?

Finovy Cloud

gpu GPU服务器 显卡、gpu

CCF201712-2 游戏

爱好编程进阶

Java 程序员 后端开发

Fluid 0

爱好编程进阶

Java 程序员 后端开发

5分钟速览证券行业财富管理转型新趋势

易观分析

证券市场

Github首次开放,一天遭狂转 50w 次,大厂内部不外传的 100 万字 Java 面试手册

爱好编程进阶

Java 程序员 后端开发

JavaScript class类的基本使用方法你知道吗

CRMEB

5年从初学者变成行业大拿,月薪暴涨10倍,我的经验值得借鉴

爱好编程进阶

程序员 后端开发

Eclipse+Java+Swing实现企业人事管理系统

爱好编程进阶

Java 程序员 后端开发

python好用的函数或库

AIWeker

Python 人工智能 5月月更

如何制作网站的在线帮助中心

小炮

帮助中心

Day461

爱好编程进阶

程序员 后端开发

手把手带你用Zabbix进行操作系统监控

博文视点Broadview

43岁老程序员的编程之路,我是如何做到退休的?龙叔真的退休了吗

爱好编程进阶

Java 程序员 后端开发

CentOS7 部署 LAMP 平台与应用

爱好编程进阶

Java 程序员 后端开发

Dubbo中的统一契约是如何实现的?

爱好编程进阶

Java 程序员 后端开发

GitHub上标星120K,Alibaba官网发布了这份Java全栈知识体系手册

爱好编程进阶

Java 程序员 后端开发

B站【狂神说Java笔记】-java基础语法

爱好编程进阶

Java 程序员 后端开发

Dubbo

爱好编程进阶

程序员 后端开发

全球云服务支出持续攀升,中国云安全市场进入黄金期

行云管家

云计算 网络安全 公有云 云服务 云平台

Backbone 之 DetNet:为检测而生(Pytorch实现及代码解析

爱好编程进阶

Java 程序员 后端开发

CentOS安装MySQL详解

爱好编程进阶

Java 程序员 后端开发

final的两个重排序规则

爱好编程进阶

程序员 后端开发

Cloud-借助消息队列解决分布式事务

爱好编程进阶

Java 程序员

CPU战争40年,终于把Intel打趴下了

爱好编程进阶

Java 程序员 后端开发

Day269

爱好编程进阶

Java 程序员 后端开发

Eclipse+Java+Swing实现仓库管理系统

爱好编程进阶

Java 程序员 后端开发

FPGA(3)--VHDL及原理图--4位全加器

爱好编程进阶

程序员 后端开发

服务器运维省钱省事省心安全就用行云管家!

行云管家

服务器 行云管家 服务器运维

6年,终拿腾讯 offer!

爱好编程进阶

程序员 后端开发

Bootstrap表格

爱好编程进阶

Java 程序员

12行JS代码的DoS攻击分析及防御_安全_刘欣雨_InfoQ精选文章