1.Cookie的誕生
由于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的主要構成如下:
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就對了服務器端設置
?
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 內容,以便持續攻擊。
?