歡迎光臨
每天分享高質量文章

瀏覽器家族的安全反擊戰

來自:碼農翻身(微訊號:coderising)

1
前言

上次我說過,我們瀏覽器的主要工作就是把HTML,JavaScript,CSS等檔案從伺服器端取下來,然後解析、渲染,展示成美奐美倫的頁面呈現給人類。

我們還替人類保護一個叫做Cookie的小東西,網站會把Cookie傳送給瀏覽器讓我們儲存起來,等到訪問同一個網站的時候,我們再把他發過去。

這個Cookie用來證明某個使用者已經和伺服器互動過,更重要的是證明已經登入過系統,不用再次登入了。

JavaScript這小子在我們這裡承擔了越來越重要的職責,從對DOM樹的改動,到利用AJAX訪問伺服器端,他可以說是風光無限。

(詳情參見上一篇文章《瀏覽器:一個家族的奮鬥》)

可是我們都忽視了一個重要的問題:安全,這個東西差點讓我們家族遭受滅頂之災。

2
Cookie失竊

有一天,我的主人登入了”愛存不存”銀行(www.icbc.com),這個銀行網站給我發了一個Cookie,證明主人登入過了, 主人在“愛存不存”銀行網站做了一些操作,但是忘記了退出,然後開了一個新的Tab頁訪問了一個叫做www.beauty.com ,我知道這個網站不懷好意,拼命地提醒主人,但是他仍然經不住網站上那些圖片的誘惑,執意把這個網站開啟。

我沒有辦法,只好下載這個不懷好意網站的HTML,JavaScript,CSS, 讓我沒有想到的是這裡的JavaScript竟然想訪問“愛存不存”銀行的Cookie。

“這個Cookie是愛存不存銀行給我的,不屬於www.beauty.com,你為啥要訪問?” 我問他。

“沒事,我好奇,想看看別的網站的Cookie長什麼樣”  他輕鬆地回答。

我將信將疑地把Cookie給了他,他不知道做了什麼花樣,似乎是往www.beauty.com發了一個請求,然後就把Cookie還給了我。

很快我的主人就發現,他在“愛存不存”銀行的私房錢不翼而飛了。

FireFox嘲笑我說:“你這個傢伙啊,怎麼能夠把Cookie這麼重要的東西隨隨便便地給別人呢? ‘愛存不存’銀行的Cookie被駭客偷走了,那些駭客不用登入就可以冒充使用者在‘愛存不存’網站做操作了。”

“啊? 有這麼嚴重? 可他是JavaScript,照理說可以訪問啊?”

“唉,你要知道,這個JavaScript和那個Cookie不是同一個網站的,怎麼能訪問呢。”

由於這件事,主人再我不理我了,從此開始寵幸FireFox。

3
密碼失竊

FireFox也沒得意很久,他也很快中了招。

這一次,主人還是忍不住去www.beauty.com看圖片,FireFox這次很小心,不把任何別的網站的Cookie發給這裡的JavaScript。

但這一次beauty.com改變了策略,它用iframe的方式放置了一個淘寶的登入網頁到beauty.com頁面中,淘寶恰恰是主人最喜歡的,主人一看,不錯啊,還有快捷登入方式,於是主人就輸入了自己真實的使用者名稱和密碼,沒想到Beauty.com的JavaScript 已經把這個淘寶登入Form的action指向了自家網站,等到主人點了登入按鈕以後, 使用者名稱和明文的密碼就這樣被竊取了。

於是FireFox也被打入冷宮。

4
家族會議

駭客猖獗,類似的安全事故不斷出現,我們家族的成員紛紛中招,家族趕緊召集會議,商量對策,防止人類把我們家族給廢掉。

我和FireFox在會議上聲討現在的人類實在是喜歡訪問那些不良網站,族長Mozilla說沒辦法這是人類的本性,無論如何也無法改變,如果改了就不是人類了。

“雖然我們控制不了人類的行為,但是我們瀏覽器家族可以做點改變,增加安全性!” Mozilla族長充滿正義感和使命感,他下達了一個命令:“以後我們家族確定一條鐵規:除非兩個網頁是來自於統一‘源頭’, 否則不允許一個網頁的JavaScript訪問另外一個網頁的內容,像Cookie,DOM,LocalStorage統統禁止訪問!” 

我仔細咂摸這句話的含義,其實是說各個網頁如果不同源的,就被隔離了,只能在自己的一畝三分地中折騰。

“什麼叫同一個源頭?” FireFox問道。

“就是說{protocol,host,port} 這三個東西必須得一樣! 我給你們舉個例子, 例如有這麼一個網頁: http://www.store.com/product/page.html, 下麵的表格列出了各種不同情況。

這個同源策略確實嚴格, 不同源的網頁無法訪問另外一個網頁的DOM,Cookie, 像beauty.com那樣的惡意網站想偷走Cookie/密碼就不容易了。

我想到了主人之前購物經常訪問的http://www.store.com/, 這個頁面中有一段裝載jquery.js的程式碼:

這個jquery.js是來自於不同的源(static.store.com), 難道他就沒法操作www.store.com頁面的內容了嗎? 如果不能操作,這個jquery.js就沒有任何用處啦!

我把這個困惑給大家說了下, FireFox馬上附和: “沒錯,難道我們要強制人類把所有的JavaScript程式碼放到www.store.com下嗎? 人類肯定不能容忍! ”

“嗯,這是個好問題”  Mozilla族長說,“這樣,我給你們開個口子,對於使用

分享創造快樂