Zakariyya / blog

https://zakariyya.github.io/blog/
6 stars 1 forks source link

十二行代码 #105

Open Zakariyya opened 4 years ago

Zakariyya commented 4 years ago

date: 2016.03.02 tags: categories: 随笔

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

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

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

完整 HTML 代码如下:

 <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= 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)……