Cookie详解整理
1.Cookie的誕生
由于HTTP協(xié)議是無狀態(tài)的,而服務(wù)器端的業(yè)務(wù)必須是要有狀態(tài)的。Cookie誕生的最初目的是為了存儲web中的狀態(tài)信息,以方便服務(wù)器端使用。比如判斷用戶是否是第一次訪問網(wǎng)站。目前最新的規(guī)范是RFC 6265,它是一個由瀏覽器服務(wù)器共同協(xié)作實現(xiàn)的規(guī)范。
2.Cookie的處理分為:
1.服務(wù)器像客戶端發(fā)送cookie
2.瀏覽器將cookie保存
3之后每次http請求瀏覽器都會將cookie發(fā)送給服務(wù)器端,服務(wù)器端的發(fā)送與解析
3.發(fā)送cookie
服務(wù)器端像客戶端發(fā)送Cookie是通過HTTP響應(yīng)報文實現(xiàn)的,在Set-Cookie中設(shè)置需要像客戶端發(fā)送的cookie,cookie格式如下:
Set-Cookie: "name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure"
其中name=value是必選項,其它都是可選項。Cookie的主要構(gòu)成如下:
name:一個唯一確定的cookie名稱。通常來講cookie的名稱是不區(qū)分大小寫的。
value:存儲在cookie中的字符串值。最好為cookie的name和value進行url編碼
domain:cookie對于哪個域是有效的。所有向該域發(fā)送的請求中都會包含這個cookie信息。
這個值可以包含子域(如:xx.xxx.com),也可以不包含它(如:.xxx.com,則對于aliyun.com的所有子域都有效).
path: 表示這個cookie影響到的路徑,瀏覽器跟會根據(jù)這項配置,像指定域中匹配的路徑發(fā)送cookie。
expires:失效時間,表示cookie何時應(yīng)該被刪除的時間戳(也就是,何時應(yīng)該停止向服務(wù)器發(fā)送這個cookie)。如果不設(shè)置這個時間戳,瀏覽器會在頁面關(guān)閉時即將刪除所有cookie;不過也可以自己設(shè)置刪除時間。這個值是GMT時間格式,如果客戶端和服務(wù)器端時間不一致,使用expires就會存在偏差。
max-age: 與expires作用相同,用來告訴瀏覽器此cookie多久過期(單位是秒),而不是一個固定的時間點。正常情況下,max-age的優(yōu)先級高于expires。
HttpOnly: 告知瀏覽器不允許通過腳本document.cookie去更改這個值,同樣這個值在document.cookie中也不可見。但在http請求張仍然會攜帶這個cookie。注意這個值雖然在腳本中不可獲取,但仍然在瀏覽器安裝目錄中以文件形式存在。這項設(shè)置通常在服務(wù)器端設(shè)置。
secure: 安全標志,指定后,只有在使用SSL鏈接時候才能發(fā)送到服務(wù)器,如果是http鏈接則不會傳遞該信息。就算設(shè)置了secure 屬性也并不代表他人不能看到你機器本地保存的 cookie 信息,所以不要把重要信息放cookie就對了服務(wù)器端設(shè)置
?
4.cookie分類:
Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分為內(nèi)存Cookie和硬盤Cookie。
當cookie沒有設(shè)置expires或者設(shè)置為0時,就形成了內(nèi)存Cookie,內(nèi)存Cookie由瀏覽器維護,保存在內(nèi)存中,瀏覽器關(guān)閉后就消失了,其存在時間是短暫的。
硬盤Cookie保存在硬盤里,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除,其存在時間是長期的。
所以,按存在時間,可分為非持久Cookie和持久Cookie。
?
5.Cookie的缺陷:
Cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
由于在HTTP請求中的Cookie是明文傳遞的,所以安全性成問題。(除非用HTTPS)
Cookie的大小限制在4KB左右。對于復(fù)雜的存儲需求來說是不夠用的
用戶可以改變?yōu)g覽器的設(shè)置,以使用Cookies。
如果在一臺計算機中安裝多個瀏覽器,每個瀏覽器都會以獨立的空間存放Cookie。因為Cookie中不但可以確認用戶信息,還能包含計算機和瀏覽器的信息,所以一個用戶使用不同的瀏覽器登錄或者用不同的計算機登錄,都會得到不同的Cookie信息,另一方面,對于在同一臺計算機上使用同一瀏覽器的多用戶群,Cookie不會區(qū)分他們的身份,除非他們使用不同的用戶名登錄。
?
6.腳本攻擊:
盡管cookie沒有病毒那么危險,但它仍包含了一些敏感信息:用戶名,計算機名,使用的瀏覽器和曾經(jīng)訪問的網(wǎng)站。用戶不希望這些內(nèi)容泄漏出去,尤其是當其中還包含有私人信息的時候。
這并非危言聳聽,一種名為跨站點腳本攻擊(Cross site scripting)可以達到此目的。通常跨站點腳本攻擊往往利用網(wǎng)站漏洞在網(wǎng)站頁面中植入腳本代碼或網(wǎng)站頁面引用第三方法腳本代碼,均存在跨站點腳本攻擊的可能,在受到跨站點腳本攻擊時,腳本指令將會讀取當前站點的所有 Cookie 內(nèi)容(已不存在 Cookie 作用域限制),然后通過某種方式將 Cookie 內(nèi)容提交到指定的服務(wù)器(如:AJAX)。一旦 Cookie 落入攻擊者手中,它將會重現(xiàn)其價值。
?
7.建議開發(fā)人員在向客戶端 Cookie 輸出敏感的內(nèi)容時(譬如:該內(nèi)容能識別用戶身份):
1)設(shè)置該 Cookie 不能被腳本讀取,這樣在一定程度上解決上述問題。
2)對 Cookie 內(nèi)容進行加密,在加密前嵌入時間戳,保證每次加密后的密文都不一樣(并且可以防止消息重放)。
3)客戶端請求時,每次或定時更新 Cookie 內(nèi)容(即:基于第2小條,重新加密)
4)每次向 Cookie 寫入時間戳,數(shù)據(jù)庫需要記錄最后一次時間戳(防止 Cookie 篡改,或重放攻擊)。
5)客戶端提交 Cookie 時,先解密然后校驗時間戳,時間戳若小于數(shù)據(jù)數(shù)據(jù)庫中記錄,即意味發(fā)生攻擊。
基于上述建議,即使 Cookie 被竊取,卻因 Cookie 被隨機更新,且內(nèi)容無規(guī)律性,攻擊者無法加以利用。另外利用了時間戳另一大好處就是防止 Cookie 篡改或重放。
Cookie 竊取:搜集用戶cookie并發(fā)給攻擊者的黑客。攻擊者將利用cookie信息通過合法手段進入用戶帳戶。
Cookie 篡改:利用安全機制,攻擊者加入代碼從而改寫 Cookie 內(nèi)容,以便持續(xù)攻擊。
?
轉(zhuǎn)載于:https://www.cnblogs.com/joshua317/p/6656692.html
總結(jié)
以上是生活随笔為你收集整理的Cookie详解整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA-容器(2)-Collectio
- 下一篇: 算法复习——计算几何基础(zoj1081