Cookie詳解整理

1.Cookie的誕生web

因爲HTTP協議是無狀態的,而服務器端的業務必須是要有狀態的。Cookie誕生的最初目的是爲了存儲web中的狀態信息,以方便服務器端使用。好比判斷用戶是不是第一次訪問網站。目前最新的規範是RFC 6265,它是一個由瀏覽器服務器共同協做實現的規範。數據庫

2.Cookie的處理分爲:
1.服務器像客戶端發送cookie
2.瀏覽器將cookie保存
3以後每次http請求瀏覽器都會將cookie發送給服務器端,服務器端的發送與解析

瀏覽器

3.發送cookie
服務器端像客戶端發送Cookie是經過HTTP響應報文實現的,在Set-Cookie中設置須要像客戶端發送的cookie,cookie格式以下:安全

Set-Cookie: "name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure"服務器

其中name=value是必選項,其它都是可選項。Cookie的主要構成以下:cookie

name:一個惟一肯定的cookie名稱。一般來說cookie的名稱是不區分大小寫的。
value:存儲在cookie中的字符串值。最好爲cookie的name和value進行url編碼
domain:cookie對於哪一個域是有效的。全部向該域發送的請求中都會包含這個cookie信息。併發

這個值能夠包含子域(如:xx.xxx.com),也能夠不包含它(如:.xxx.com,則對於aliyun.com的全部子域都有效).
path: 表示這個cookie影響到的路徑,瀏覽器跟會根據這項配置,像指定域中匹配的路徑發送cookie。
expires:失效時間,表示cookie什麼時候應該被刪除的時間戳(也就是,什麼時候應該中止向服務器發送這個cookie)。若是不設置這個時間戳,瀏覽器會在頁面關閉時即將刪除全部cookie;不過也能夠本身設置刪除時間。這個值是GMT時間格式,若是客戶端和服務器端時間不一致,使用expires就會存在誤差。
max-age: 與expires做用相同,用來告訴瀏覽器此cookie多久過時(單位是秒),而不是一個固定的時間點。正常狀況下,max-age的優先級高於expires。
HttpOnly: 告知瀏覽器不容許經過腳本document.cookie去更改這個值,一樣這個值在document.cookie中也不可見。但在http請求張仍然會攜帶這個cookie。注意這個值雖然在腳本中不可獲取,但仍然在瀏覽器安裝目錄中以文件形式存在。這項設置一般在服務器端設置。
secure: 安全標誌,指定後,只有在使用SSL連接時候才能發送到服務器,若是是http連接則不會傳遞該信息。就算設置了secure 屬性也並不表明他人不能看到你機器本地保存的 cookie 信息,因此不要把重要信息放cookie就對了服務器端設置dom

 

4.cookie分類:
Cookie老是保存在客戶端中,按在客戶端中的存儲位置,可分爲內存Cookie和硬盤Cookie。
當cookie沒有設置expires或者設置爲0時,就造成了內存Cookie,內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉後就消失了,其存在時間是短暫的。網站

硬盤Cookie保存在硬盤裏,有一個過時時間,除非用戶手工清理或到了過時時間,硬盤Cookie不會被刪除,其存在時間是長期的。
因此,按存在時間,可分爲非持久Cookie和持久Cookie。編碼

 

5.Cookie的缺陷:

Cookie會被附加在每一個HTTP請求中,因此無形中增長了流量。
因爲在HTTP請求中的Cookie是明文傳遞的,因此安全性成問題。(除非用HTTPS)
Cookie的大小限制在4KB左右。對於複雜的存儲需求來講是不夠用的

用戶能夠改變瀏覽器的設置,以使用Cookies。
若是在一臺計算機中安裝多個瀏覽器,每一個瀏覽器都會以獨立的空間存放Cookie。由於Cookie中不但能夠確認用戶信息,還能包含計算機和瀏覽器的信息,因此一個用戶使用不一樣的瀏覽器登陸或者用不一樣的計算機登陸,都會獲得不一樣的Cookie信息,另外一方面,對於在同一臺計算機上使用同一瀏覽器的多用戶羣,Cookie不會區分他們的身份,除非他們使用不一樣的用戶名登陸。

 

6.腳本攻擊:

儘管cookie沒有病毒那麼危險,但它仍包含了一些敏感信息:用戶名,計算機名,使用的瀏覽器和曾經訪問的網站。用戶不但願這些內容泄漏出去,尤爲是當其中還包含有私人信息的時候。
這並不是危言聳聽,一種名爲跨站點腳本攻擊(Cross site scripting)能夠達到此目的。一般跨站點腳本攻擊每每利用網站漏洞在網站頁面中植入腳本代碼或網站頁面引用第三方法腳本代碼,均存在跨站點腳本攻擊的可能,在受到跨站點腳本攻擊時,腳本指令將會讀取當前站點的全部 Cookie 內容(已不存在 Cookie 做用域限制),而後經過某種方式將 Cookie 內容提交到指定的服務器(如:AJAX)。一旦 Cookie 落入攻擊者手中,它將會重現其價值。

 

7.建議開發人員在向客戶端 Cookie 輸出敏感的內容時(譬如:該內容能識別用戶身份):
1)設置該 Cookie 不能被腳本讀取,這樣在必定程度上解決上述問題。
2)對 Cookie 內容進行加密,在加密前嵌入時間戳,保證每次加密後的密文都不同(而且能夠防止消息重放)。
3)客戶端請求時,每次或定時更新 Cookie 內容(即:基於第2小條,從新加密)
4)每次向 Cookie 寫入時間戳,數據庫須要記錄最後一次時間戳(防止 Cookie 篡改,或重放攻擊)。
5)客戶端提交 Cookie 時,先解密而後校驗時間戳,時間戳若小於數據數據庫中記錄,即意味發生攻擊。

基於上述建議,即便 Cookie 被竊取,卻因 Cookie 被隨機更新,且內容無規律性,攻擊者沒法加以利用。另外利用了時間戳另外一大好處就是防止 Cookie 篡改或重放。Cookie 竊取:蒐集用戶cookie併發給攻擊者的黑客。攻擊者將利用cookie信息經過合法手段進入用戶賬戶。Cookie 篡改:利用安全機制,攻擊者加入代碼從而改寫 Cookie 內容,以便持續攻擊。

相關文章
相關標籤/搜索