這兩天空間和朋友圈開始流行分享一個(gè)惡搞鏈接,在應(yīng)用中點(diǎn)擊可以直接導(dǎo)致應(yīng)用閃退,在瀏覽器中打開也能直接讓瀏覽器崩潰。這是怎么做到的呢?下面就來(lái)研究一下。
隨便在網(wǎng)上以“十二行代碼 瀏覽器”為關(guān)鍵詞搜一下,就有一大堆類似結(jié)果:
這十二行代碼的起源應(yīng)該是Twitter上的 IT Security Tweets ? @F1r3h4nd :
Crash your friend’s browser and restart Iphone with a link which has this script: #0day// 把帶有下面這個(gè)腳本的鏈接發(fā)給你的朋友,能讓你朋友的瀏覽器崩潰,而且能讓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>
有興趣的可以點(diǎn)擊這里測(cè)試一下。 【友情提醒:請(qǐng)先保存瀏覽器上的工作:) 拿來(lái)整人的被打死不負(fù)責(zé)哦~】
點(diǎn)擊完可能產(chǎn)生的后果:
以下是博主自己測(cè)試的結(jié)果:
這段代碼的核心就是 history.pushState() 方法。
這個(gè)方法是 HTML5 的一個(gè) API,用于向history添加當(dāng)前頁(yè)面的記錄。簡(jiǎn)單來(lái)說(shuō)就是在不刷新頁(yè)面,也不打開新頁(yè)面的情況下,改變?yōu)g覽器地址欄中的URL。這個(gè)技術(shù)可以解決AJAX遺留下來(lái)的問(wèn)題。它和AJAX結(jié)合后,有個(gè)新的稱呼是PJAX(淘寶目前正在使用)。
這里的代碼: history.pushState(0, 0, total);
只能起到一個(gè)效果,就是修改URL(只能修改當(dāng)前目錄后的字符,無(wú)法修改全部域名。且不會(huì)發(fā)生跳轉(zhuǎn)或發(fā)送請(qǐng)求)。然后這里代碼循環(huán)了1000000次,也就是說(shuō)URL修改了1000000次,每次新的URL都是之前一次的后面再加上 i.toString()
。這樣快速不停地向history中添加記錄,最終就會(huì)導(dǎo)致內(nèi)存占用迅速增大到機(jī)器無(wú)法承受,然后瀏覽器崩潰。
所以PC上面才會(huì)出現(xiàn)內(nèi)存和CPU突然一路飆升,而手機(jī)的內(nèi)存和處理器本身就跟PC沒得比,所以崩潰也是自然的。至于iPhone上的Safari是如何讓iPhone重啟的,這個(gè)就不得而知了。
聯(lián)系客服