天天看點

cookie淺談

前言

       網絡早期最大的問題之一是如何管理狀态。簡而言之,伺服器無法知道兩個請求是否來自同一個浏覽器。當時最簡單的方法是在請求時,在頁面中插入一些參數,并在下一個請求中傳回參數。這需要使用包含參數的隐藏的表單,或者作為URL參數的一部分傳遞。這兩個解決方案都手動操作,容易出錯。

網景公司當時一名員工Lou Montulli,在1994年将“cookies”的概念應用于網絡通信,用來解決使用者網上購物的購物車曆史記錄,目前所有浏覽器都支援cookies。

cookie是什麼

       由于http是無狀态的協定,一旦用戶端和伺服器的資料交換完畢,就會斷開連接配接,再次請求,會重新連接配接,這就說明伺服器單從網絡連接配接上是沒有辦法知道使用者身份的。怎麼辦呢?那就給每次新的使用者請求時,給它頒發一個身份證(獨一無二)吧,下次通路,必須帶上身份證,這樣伺服器就會知道是誰來通路了,針對不同使用者,做出不同的響應。,這就是Cookie的原理。

       其實cookie是一個很小的文本檔案,是浏覽器儲存在使用者的機器上的。Cookie是純文字,沒有可執行代碼。儲存一些伺服器需要的資訊,每次請求站點,會發送相應的cookie,這些cookie可以用來辨識使用者身份資訊等作用。

cookie淺談

  如圖所示,使用者首次通路伺服器,伺服器會傳回一個獨一無二的識别碼;id=23451,這樣伺服器可以用這個碼跟蹤記錄使用者的資訊,(購物曆史,位址資訊等)。

  cookie可以包含任意的資訊,不僅僅是id,用戶端會記錄伺服器傳回來的Set-Cookie首部中的cookie内容。并将cookie存儲在浏覽器的cookie資料庫中,當使用者通路同一站點時,浏覽器就會挑選當時該站點頒發的id=XXX的身份證(cookie),并在Cookie請求首部發送過去。

cookie的類型

  可以按照過期時間分為兩類:會話cookie和持久cookie。會話cookie是一種臨時cookie,使用者退出浏覽器,會話Cookie就會被删除了,持久cookie則會儲存在硬碟裡,保留時間更長,關閉浏覽器,重新開機電腦,它依然存在,通常是持久性的cookie會維護某一個使用者周期性通路伺服器的配置檔案或者登入資訊。

持久cookie 設定一個特定的過期時間(Expires)或者有效期(Max-Age)

cookie的屬性

cookie域

  産生Cookie的伺服器可以向set-Cookie響應首部添加一個Domain屬性來控制哪些站點可以看到那個cookie,例如下面:

  如果使用者通路的是m.zhuanzhuan.58.com那就會發送cookie: name="wang", 如果使用者通路www.aaa.com(非zhuanzhuan.58.com)就不會發送這個Cookie。

cookie的路徑 Path

  Path屬性可以為伺服器特定文檔指定Cookie,這個屬性設定的url且帶有這個字首的url路徑都是有效的。

  例如:m.zhuanzhuan.58.com 和 m.zhaunzhuan.58.com/user/這兩個url。 m.zhuanzhuan.58.com 設定cookie

  m.zhaunzhuan.58.com/user/ 設定cookie:

但是通路其他路徑m.zhuanzhuan.58.com/other/就會獲得

如果通路m.zhuanzhuan.58.com/user/就會獲得

secure

設定了屬性secure,cookie隻有在https協定加密情況下才會發送給服務端。但是這并不是最安全的,由于其固有的不安全性,敏感資訊也是不應該通過cookie傳輸的.

chrome 52和firefox 52 開始不安全的(HTTP)是無法使用secure的:

操作Cookie

通過docuemnt.cookie可以設定和擷取Cookie的值

禁止javascript操作cookie(為避免跨域腳本(xss)攻擊,通過javascript的document.cookie無法通路帶有HttpOnly标記的cookie。)

第三方cookie

通常cookie的域和浏覽器位址的域比對,這被稱為第一方cookie。那麼第三方cookie就是cookie的域和位址欄中的域不比對,這種cookie通常被用在第三方廣告網站。為了跟蹤使用者的浏覽記錄,并且根據收集的使用者的浏覽習慣,給使用者推送相關的廣告。

cookie淺談

如上圖(a):使用者通路伺服器1的一個頁面index.html,這個頁面和第三方廣告網站合作,這個頁面還有一張www.advertisement.com域名下的一張廣告圖ad1.jpg,當請求這張ad1.jpg圖檔的時候,www.advertisement.com這個伺服器會給使用者設定cookie

記錄使用者的浏覽記錄,配置設定一個user來表示使用者的身份。

圖(b):使用者通路伺服器2的一個index.html頁面,這個頁面也和同一家廣告商合作,這個頁面也包含一張www.advertisement.com域名下的一張廣告圖ad2.jpg,當請求這張ad2.jpg圖檔的時候,浏覽器就會向www.advertisement.com發送cookie

www.advertisement.com收到浏覽器發送的cookie識别了使用者的身份,同時又把這個頁面使用者的浏覽資料設定cookie

圖(c):很巧,使用者通路伺服器3的一個index.html頁面,這個頁面也和那一家廣告商合作,這個頁面也包含一張www.advertisement.com域名下的一張廣告圖ad3.jpg,當請求這張ad3.jpg圖檔的時候,浏覽器就會向www.advertisement.com發送cookie

這樣廣告公司就可以根據使用者的浏覽習慣,給使用者推送合适的廣告。

安全

多數網站使用cookie作為使用者會話的唯一辨別,因為其他的方法具有限制和漏洞。如果一個網站使用cookies作為會話辨別符,攻擊者可以通過竊取一套使用者的cookies來冒充使用者的請求。從伺服器的角度,它是沒法分辨使用者和攻擊者的,因為使用者和攻擊者擁有相同的身份驗證。 下面介紹幾種cookie盜用和會話劫持的例子:

網絡竊聽

網絡上的流量可以被網絡上任何計算機攔截,特别是未加密的開放式WIFI。這種流量包含在普通的未加密的HTTP清求上發送Cookie。在未加密的情況下,攻擊者可以讀取網絡上的其他使用者的資訊,包含HTTP Cookie的全部内容,以便進行中間的攻擊。比如:攔截cookie來冒充使用者身份執行惡意任務(銀行轉賬等)。

解決辦法:伺服器可以設定secure屬性的cookie,這樣就隻能通過https的方式來發送cookies了。

DNS緩存中毒

如果攻擊者可以使DNS緩存中毒,那麼攻擊者就可以通路使用者的Cookie了,例如:攻擊者使用DNS中毒來建立一個虛拟的NDS服務h123456.www.demo.com指向攻擊者伺服器的ip位址。然後攻擊者可以從伺服器 h123456.www.demo.com/img_01.png 釋出圖檔。使用者通路這個圖檔,由于 www.demo.com和h123456.www.demo.com是同一個子域,是以浏覽器會把使用者的與www.demo.com相關的cookie都會發送到h123456.www.demo.com這個伺服器上,這樣攻擊者就會拿到使用者的cookie搞事情。

一般情況下是不會發生這種情況,通常是網絡供應商錯誤。

跨站點腳本XSS

使用跨站點腳本技術可以竊取cookie。當網站允許使用javascript操作cookie的時候,就會發生攻擊者釋出惡意代碼攻擊使用者的會話,同時可以拿到使用者的cookie資訊。

當使用者點選這個連結的時候,浏覽器就會執行onclick裡面的代碼,結果這個網站使用者的cookie資訊就會被發送到abc.com攻擊者的伺服器。攻擊者同樣可以拿cookie搞事情。

解決辦法:可以通過cookie的HttpOnly屬性,設定了HttpOnly屬性,javascript代碼将不能操作cookie。

跨站請求僞造CSRF

例如,SanShao可能正在浏覽其他使用者XiaoMing釋出消息的聊天論壇。假設XiaoMing制作了一個引用ShanShao銀行網站的HTML圖像元素,例如,

如果SanShao的銀行将其認證資訊儲存在cookie中,并且cookie尚未過期,(當然是沒有其他驗證身份的東西),那麼SanShao的浏覽器嘗試加載該圖檔将使用他的cookie送出提款表單,進而在未經SanShao準許的情況下授權交易。

解決辦法:增加其他資訊的校驗(手機驗證碼,或者其他盾牌)。