十二行代码

#十二行代码
2016年1月29日 / 芽蜜 / 0 COMMENTS

几天前在google+上看到这消息的。

事情的起因是这样的,国外一哥们Cyber Security在推特上发了这么一条推文:

这12行js代码能让手机或是电脑进入这网页后出现浏览器奔溃,假死……
1月17号,有人发推,说这段代码能让火狐、chrome、safari浏览器奔溃,能让iphone重启。

完整 HTML 代码如下:

1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<script>  
var total="";
    for (var i=0;i<1000000;i++){
total= total+i.toString ();
history.pushState (0,0,total);
}  
</script>
</body>
</html>

来看下这段代码,主要就是

1
2
total= total+i.toString();
history.pushState(0,0,total);

这两行代码执行1000000遍。
这段代码的核心真的就是 history.pushState() 方法。
这个方法是 HTML5 的一个 API,用于向history添加当前页面的记录。简单来说就是在不刷新页面,也不打开新页面的情况下,改变浏览器地址栏中的URL。这个技术可以解决AJAX遗留下来的问题。它和AJAX结合后,有个新的称呼是PJAX(淘宝目前正在使用)。
这里的代码:
history.pushState(0, 0, total);

只能起到一个效果,就是修改URL(只能修改当前目录后的字符,无法修改全部域名。且不会发生跳转或发送请求)。然后这里代码循环了1000000次,也就是说URL修改了1000000次,每次新的URL都是之前一次的后面再加上i.toString()
。这样快速不停地向history中添加记录,最终就会导致内存占用迅速增大到机器无法承受,然后浏览器崩溃。

当然那段脚本不运行的话是没问题的,比如用w3m。

演示:www.0xroot.cn/demo.html(务必做好死机准备,尽管是假死。)
要是我,肯定用while(1)……