使瀏覽器“爆炸”的12行代碼
2016年01月28日
15
分類:開發資訊
隨便在網上以“十二行代碼 瀏覽器”為關鍵詞搜一下,就有一大堆類似結果:
這十二行代碼的起源應該是Twitter上的 IT Security Tweets ? @F1r3h4nd :
Crash your friend’s browser and restart Iphone with a link which has this script: #0day// 把帶有下面這個腳本的鏈接發給你的朋友,能讓你朋友的瀏覽器崩潰,而且能讓iPhone重啟。
完整HTML代碼如下:
view sourceprint?
1 | <script> |
2 | var total = "" ; |
3 | for ( var i = 0; i < 1000000; i++) |
4 | { |
5 | total = total + i.toString(); |
6 | history.pushState(0, 0, total); |
7 | } |
8 | </script> |
有興趣的可以點擊這里測試一下。 【友情提醒:請先保存瀏覽器上的工作:) 拿來整人的被打死不負責哦~】
點擊完可能產生的后果:
PC端用瀏覽器打開:點開鏈接以后,電腦CPU內存極有可能一路狂飆直至瀏覽器崩潰卡死。
移動端(安卓、iPhone)用三方瀏覽器打開:點開鏈接以后瀏覽器會閃退。
移動端(安卓、iPhone)用嵌入瀏覽器的應用打開:在微博、微信客戶端中點開鏈接會閃退。
iPhone用Safari打開:點開鏈接之后,手機可能會注銷重啟。
以下是博主自己測試的結果:
下面就來稍微解釋一下上面這段js代碼是如何讓瀏覽器崩潰的。
這段代碼的核心就是 history.pushState() 方法。
這個方法是 HTML5 的一個 API,用于向history添加當前頁面的記錄。簡單來說就是在不刷新頁面,也不打開新頁面的情況下,改變瀏覽器地址欄中的URL。這個技術可以解決AJAX遺留下來的問題。它和AJAX結合后,有個新的稱呼是PJAX(淘寶目前正在使用)。
這里的代碼:history.pushState(0, 0, total); 只能起到一個效果,就是修改URL(只能修改當前目錄后的字符,無法修改全部域名。且不會發生跳轉或發送請求)。然后這里代碼循環了1000000次,也就是說URL修改了1000000次,每次新的URL都是之前一次的后面再加上 i.toString() 。這樣快速不停地向history中添加記錄,最終就會導致內存占用迅速增大到機器無法承受,然后瀏覽器崩潰。
所以PC上面才會出現內存和CPU突然一路飆升,而手機的內存和處理器本身就跟PC沒得比,所以崩潰也是自然的。至于iPhone上的Safari是如何讓iPhone重啟的,這個就不得而知了。