簡介
Cookie是一小段文本信息,伴隨著用戶請求和頁面在Web伺服器和瀏覽器之間傳遞。Cookie包含每次用戶訪問站點時Web應用程式都可以讀取的信息。因為HTTP協定是無狀態的,對於一個瀏覽器發出的多次請求,WEB伺服器無法區分是不是來源於同一個瀏覽器。所以,需要額外的數據用於維護會話。Cookie正是這樣的一段隨HTTP請求一起被傳遞的額外數據。因為Cookie只是一段文本,所以它只能保存字元串。而且瀏覽器對它有大小限制以及它會隨著每次請求被傳送到伺服器,所以應該保證它不要太大。Cookie的內容也是明文保存的,有些瀏覽器提供界面修改,所以,不適合保存重要的或者涉及隱私的內容。
分類
Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分為記憶體Cookie和硬碟Cookie。
記憶體Cookie由瀏覽器維護,保存在記憶體中,瀏覽器關閉後就消失了,其存在時間是短暫的。硬碟Cookie保存在硬碟里,有一個過期時間,除非用戶手工清理或到了過期時間,硬碟Cookie不會被刪除,其存在時間是長期的。所以,按存在時間,可分為非持久Cookie和持久Cookie。
功能特點
功能特點
在同一個頁面中設定Cookie,實際上是按從後往前的順序進行的。如果要先刪除一個Cookie,再寫入一個Cookie,則必須先寫寫入語句,再寫刪除語句,否則會出現錯誤。Cookie是面向路徑的。預設路徑(path)屬性時,Web伺服器頁會自動傳遞當前路徑給瀏覽器,指定路徑強制伺服器使用設定的路徑。在一個目錄頁面里設定的Cookie在另一個目錄的頁面里是看不到的。
Cookie必須在HTML檔案的內容輸出之前設定;不同的瀏覽器(Netscape Navigator、Internet Explorer)對Cookie的處理不一致,使用時一定要考慮;客戶端用戶如果設定禁止Cookie,則Cookie不能建立。
並且在客戶端,一個瀏覽器能創建的Cookie數量最多為300個,並且每個不能超過4KB,每個Web站點能設定的Cookie總數不能超過20個。
主要用途
因為HTTP協定是無狀態的,即伺服器不知道用戶上一次做了什麼,這嚴重阻礙了互動式Web應用程式的實現。Cookie就是用來繞開HTTP的無狀態性的“額外手段”之一。伺服器可以設定或讀取Cookies中包含信息,藉此維護用戶跟伺服器會話中的狀態。Cookie另一個典型的套用是當登錄一個網站時,網站往往會請求用戶輸入用戶名和密碼,並且用戶可以勾選“下次自動登錄”。如果勾選了,那么下次訪問同一網站時,用戶會發現沒輸入用戶名和密碼就已經登錄了。這正是因為前一次登錄時,伺服器傳送了包含登錄憑據(用戶名加密碼的某種加密形式)的Cookie到用戶的硬碟上。第二次登錄時,(如果該Cookie尚未到期)瀏覽器會傳送該Cookie,伺服器驗證憑據,於是不必輸入用戶名和密碼就讓用戶登錄了。
另一個重要套用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入Cookies,以便在最後付款時提取信息。
相關設定
相關函式
PHP用SetCookie函式來設定Cookie。必須注意的一點是:Cookie是HTTP協定頭的一部分,用於瀏覽器和伺服器之間傳遞信息,所以必須在任何屬於HTML檔案本身的內容輸出之前調用Cookie函式。SetCookie函式定義了一個Cookie,並且把它附加在HTTP頭的後面,SetCookie函式的原型如下:
intSetCookie(stringname,stringvalue,intexpire,stringpath,stringdomain,intsecure);
除了name之外所有的參數都是可選的。value,path,domain三個參數可以用空字元串代換,表示沒有設定;expire和secure兩個參數是數值型的,可以用0表示。expire參數是一個標準的Unix時間標記,可以用time()或mktime()函式取得,以秒為單位。secure參數表示這個Cookie是否通過加密的HTTPS協定在網路上傳輸。當前設定的Cookie不是立即生效的,而是要等到下一個頁面時才能看到.這是由於在設定的這個頁面里Cookie由伺服器傳遞給客戶瀏覽器,在下一個頁面瀏覽器才能把Cookie從客戶的機器里取出傳回伺服器的原因。在同一個頁面設定Cookie,實際是從後往前,所以如果要在插入一個新的Cookie之前刪掉一個,你必須先寫插入的語句,再寫刪除的語句,否則可能會出現不希望的結果。
使用舉例
來看幾個例子:
簡單的:
SetCookie("MyCookie","ValueofMyCookie");
帶失效時間的:
SetCookie("WithExpire","Expirein1hour",time()+3600);//3600秒=1小時
什麼都有的:
這裡還有一點要說明的,比如你的站點有幾個不同的目錄,那么如果只用不帶路徑的Cookie的話,在一個目錄下的頁面里設的Cookie在另一個目錄的頁面里是看不到的,也就是說,Cookie是面向路徑的。實際上,即使沒有指定路徑,WEB伺服器會自動傳遞當前的路徑給瀏覽器的,指定路徑會強制伺服器使用設定的路徑。解決這個問題的辦法是在調用SetCookie時加上路徑和域名,域名的格式可以是SetCookie函數裡表示value的部分,在傳遞時會自動被encode,也就是說,如果value的值是“testvalue”在傳遞時就變成了“test%20value”,跟URL的方法一樣。當然,對於程式來說這是透明的,因為在PHP接收Cookie的值時會自動將其decode。
如果要設定同名的多個Cookie,要用數組,方法是:
SetCookie("CookieArray[]","Value1");
SetCookie("CookieArray[]","Value2");
或
SetCookie("CookieArray[0]","Value1");
SetCookie("CookieArray[1]","Value2");
接收和處理Cookie
PHP對Cookie的接收和處理的支持非常好,是完全自動的,跟FORM變數的原則一樣,特別簡單。比如設定一個名為MyCookier的Cookie,PHP會自動從WEB伺服器接收的HTTP頭裡把它分析出來,並形成一個與普通變數一樣的變數,名為$myCookie,這個變數的值就是Cookie的值。數組同樣適用。
另外一個辦法是引用PHP的全局變數$HTTP_COOKIE_VARS數組。
分別舉例如下:(假設這些都在以前的頁面里設定過了,並且仍然有效)
echo$MyCookie;
echo$CookieArray[0];
echocount($CookieArray);
echo$HTTP_COOKIE_VARS["MyCookie"];
就這么簡單。
使用限制
大多數瀏覽器支持最大為4096位元組的Cookie。由於這限制了Cookie的大小,所以只好用Cookie來存儲少量數據,或者存儲用戶ID之類的標識符。用戶ID隨後便可用於標識用戶,以及從資料庫或其他數據源中讀取用戶信息。瀏覽器還限制站點可以在用戶計算機上存儲的Cookie的數量。大多數瀏覽器只允許每個站點存儲20個Cookie;如果試圖存儲更多Cookie,則最舊的Cookie便會被丟棄。有些瀏覽器還會對它們將接受的來自所有站點的Cookie總數作出絕對限制,通常為300個。
生存周期
Cookie可以保持登錄信息到用戶下次與伺服器的會話,換句話說,下次訪問同一網站時,用戶會發現不必輸入用戶名和密碼就已經登錄了(當然,不排除用戶手工刪除Cookie)。而還有一些Cookie在用戶退出會話的時候就被刪除了,這樣可以有效保護個人隱私。Cookie在生成時就會被指定一個Expire值,這就是Cookie的生存周期,在這個周期內Cookie有效,超出周期Cookie就會被清除。有些頁面將Cookie的生存周期設定為“0”或負值,這樣在關閉瀏覽器時,就馬上清除Cookie,不會記錄用戶信息,更加安全。
使用和禁用
用戶可以改變瀏覽器的設定,以使用或者禁用Cookies。
GoogleChrome
“自定義和控制”(瀏覽器地址欄右側的扳手圖示)>選項(設定)>高級選項(顯示高級設定)
通過cookie設定,更改cookie設定(隱私權說明)>內容設定>Cookie允許站點存儲本機數據(建議)
Konqueror
如果沒有設定cookie列表,請記住在域名前面加入“.”,例如.wikipedia.org,否則wikipedia將不會讀取cookie(針對KDE3.3)。
微軟
工具>Internet選項>隱私頁調節滑塊或者點擊“高級”,進行設定。MozillaFirefox
工具>選項>隱私(註:在Linux版本中,可能會是如下操作:編輯>屬性>隱私,而Mac則是:Firefox>偏好>隱私)設定Cookies選項
設定阻止/允許的各個域內Cookie
查看Cookies管理視窗,檢查現存Cookie信息,選擇刪除或者阻止它們
Opera
按F12彈出一個選單,從中可以快速設定允許或禁用cookie。
更多設定項目在首選項>高級>cookie
也可對不同域作不同的cookie設定。在網頁空白處按右鍵>編輯站點首選項>cookie
蘋果公司Safari
Safari>預置>安全標籤選擇以下的選項
總是接受Cookies
永不接受Cookies
接受Cookies僅從您瀏覽的站點(例如,不接受來自其它站點的廣告)默認的選項
您可以顯示所有駐留在您瀏覽器中的cookies,也可隨時將它們之一刪除。
導出方法
在Windows XP系統中利用“導入/導出嚮導”可以方便地導出Cookie信息,方法如下:第1步,打開“導入/導出嚮導”並單擊“下一步”按鈕,在打開的“導入/導出選擇”嚮導頁中選中“導出Cookie”選項,並單擊“下一步”按鈕。
第2步,在打開的“導出Cookie目標”嚮導頁中,單擊“瀏覽”按鈕指定合適的位置和檔案名稱,並單擊“下一步”按鈕。
第3步,打開“正在完成導入/導出嚮導”嚮導頁,單擊“完成”按鈕開始導出操作。導出成功後會給出提示,單擊“確定”按鈕即可。
刪除方法
常規刪除
第一個是:新建一個有相同name名稱的cookie,把value值設為空,然後設定它生存時間為0
比如要刪除一個名叫username的cookie:
Cookie c=new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
第二個是*(vista中):在桌面按F1,彈出幫助,輸入cookie,選擇刪除Internet cookie,彈出"Internet選項",在瀏覽記錄一欄里選擇“刪除”,然後彈出刪除的內容(包括臨時檔案,表單記錄等),選擇刪除cookie,即可。
此法,適用於各種瀏覽器,包括360,遨遊,閃游,火狐,世界之窗等。
IE瀏覽器
1、在打開的下拉列表中點擊“Internet選項”。2、在打開的彈出選單中點擊"刪除按鈕"。
3、選中"Cookie和網站數據",其它項可以不選中,再點擊下面的刪除按鈕。等待約10秒鐘左右,就會出現刪除成功的提示。
flash
1、在打開的“控制臺”中點擊“Flash Player”。2、在打開的"flash player設定管理器"中選擇"存儲",再點擊"全部刪除"按鈕。
3、最後選中“刪除所有站點數據和設定”,然後點擊“刪除數據”按鈕就即可。
弊端
一些人反對cookies在網路中的套用,他們的理由如下:
識別不精確如果在一台計算機中安裝多個瀏覽器,每個瀏覽器都會以獨立的空間存放cookie。因為cookie中不但可以確認用戶,還能包含計算機和瀏覽器的信息,所以一個用戶用不同的瀏覽器登錄或者用不同的計算機登錄,都會得到不同的cookie信息,另一方面,對於在同一台計算機上使用同一瀏覽器的多用戶群,cookie不會區分他們的身份,除非他們使用不同的用戶名登錄。
隱私、安全和廣告Cookies在某種程度上說已經嚴重危及用戶的隱私和安全。其中的一種方法是:一些公司的高層人員為了某種目的(譬如市場調研)而訪問了從未去過的網站(通過搜尋引擎查到的),而這些網站包含了一種叫做網頁臭蟲的圖片,該圖片透明,且只有一個象素大小(以便隱藏),它們的作用是將所有訪問過此頁面的計算機寫入cookie。而後,電子商務網站將讀取這些cookie信息,並尋找寫入這些cookie的網站,隨即傳送包含了針對這個網站的相關產品廣告的垃圾郵件給這些高級人員。
偷竊Cookies和腳本攻擊雖然cookies沒有中電腦病毒那么危險,但它仍包含了一些敏感信息:用戶名,電腦名,使用的瀏覽器和曾經訪問的網站。用戶不希望這些內容泄漏出去,尤其是當其中還包含有私人信息的時候。
這並非危言聳聽,跨站點腳本(Crosssitescripting)可以達到此目的。在受到跨站點腳本攻擊時,cookie盜賊和cookie毒藥將竊取內容。一旦cookie落入攻擊者手中,它將會重現其價值。
Cookie盜賊:蒐集用戶cookie並發給攻擊者的黑客。攻擊者將利用cookie信息通過合法手段進入用戶帳戶。
Cookie投毒:一般認為,Cookie在儲存和傳回服務器期間沒有被修改過,而攻擊者會在cookie送回伺服器之前對其進行修改,達到自己的目的。例如,在一個購物網站的cookie中包含了顧客應付的款項,攻擊者將該值改小,達到少付款的目的。這就是cookie投毒。
替代品
鑒於cookie的局限和反對者的聲音,有如下一些替代方法:
Brownie方案,是一項開放原始碼工程,由SourceForge發起。Brownie曾被用以共享在不同域中的接入,而cookies則被構想成單一域中的接入。這項方案已經停止開發。
p3p,用以讓用戶獲得更多控制個人隱私權利的協定。在瀏覽網站時,它類似於cookie。
在與伺服器傳輸數據時,通過在地址後面添加唯一查詢串,讓伺服器識別是否合法用戶,也可以避免使用cookie。
隱私泄漏
跨站Cookie
實際上,Cookie中保存的用戶名、密碼等個人敏感信息通常經過加密,很難將其反向破解。但這並不意味著絕對安全,黑客可通過木馬病毒盜取用戶瀏覽器Cookie,直接通過偷取的Cookie騙取網站信任。可以看出,木馬病毒入侵用戶電腦是導致用戶個人信息泄露的一大元兇。
自1993年Cookie誕生以來,其就擁有專屬性原則,即A網站存放在Cookie中的用戶信息,B網站是沒有許可權直接獲取的。但是,一些第三方廣告聯盟的代碼使用範圍很廣。這就造成用戶在A網站搜尋了一個關鍵字,用戶繼續訪問B網站,由於B網站也使用了同一家的第三方廣告代碼,這個代碼可以從Cookie中獲取用戶在A網站的搜尋行為,進而展示更精準的推廣廣告。比如搜尋“糖尿病”等關鍵字,再訪問其聯盟網站,頁面會立刻出現糖尿病治療廣告。如果並未事先告之,經用戶同意,此做法有對隱私構成侵犯的嫌疑。這個還處在灰色地帶。
因此,跨站Cookie恰恰就是用戶隱私泄露的罪魁禍首,所以限制網站使用跨站Cookie,給用戶提供禁止跟蹤(DNT)功能選項已成為當務之急。據了解,IE、Chrome、360、搜狗等瀏覽器均可以快速清除用戶瀏覽器網頁的Cookie信息。但從整體的隱私安全保護環境來看,安全軟體仍然存在著巨大的防護缺口。所以安全軟體也可以並且有必要提供定期清理網站Cookie,並監測跨站Cookie使用的功能,保護用戶隱私安全。
超級Cookies
英國倫敦的一名軟體開發者已發現了一串代碼,能在瀏覽器的隱私模式中執行普通會話,這將導致隱私模式的失效。
目前,所有主流瀏覽器都提供了隱私保護模式。在這種模式下,網站的Cookies無法追蹤用戶身份。例如,谷歌Chrome瀏覽器提供了名為“Incognito”的功能,而火狐瀏覽器則提供了“隱私視窗”功能。
不過,新發現的這一漏洞將導致瀏覽器隱私模式的失效。例如,當用戶使用普通瀏覽器,在亞馬遜網站上購物或瀏覽Facebook時,用戶可能會啟動一個隱私視窗,去瀏覽存在爭議內容的部落格。如果這一部落格使用了與亞馬遜同樣的廣告網路,或是集成了Facebook的“點讚”按鈕,那么廣告主和Facebook可以知道,用戶在訪問亞馬遜和Facebook的同時也訪問了這一爭議部落格。
對於這一漏洞,用戶有一個臨時解決辦法,但是比較麻煩:用戶可以在啟動隱私模式之前刪除所有Cookies檔案,或者使用一個專門的瀏覽器,完全在隱私模式下進行瀏覽。諷刺的是,這一漏洞是由於一項旨在加強隱私保護的功能所引起的。
如果用戶在瀏覽器地址欄使用前綴https://,為某些網站的通信加密,那么一些瀏覽器會對此進行記憶。瀏覽器會保存一個“超級Cookie”,從而確保當用戶下次連線該網站時,瀏覽器會自動進入https通道。即使用戶啟用了隱私模式,這一記憶仍會存在。
與此同時,這樣的超級Cookie也允許第三方網路程式,例如廣告和社交媒體按鈕,對用戶進行記憶。
發現這一漏洞的獨立研究員薩姆·格林哈爾(SamGreenhelgh)在部落格中表示,這種功能還沒有被任何公司所使用。不過在這種方式被公開之後,沒有任何辦法去阻止各家公司這樣做。
線上隱私軟體公司Abine聯合創始人尤金·庫茲涅佐夫(EugeneKuznetsov)認為,這種“超級Cookie”將成為下一代追蹤工具。這種工具脫胎於Cookies,但變得更加複雜。目前,用戶在瀏覽過程中總是會存在設備唯一識別碼,以及具有唯一性的瀏覽器指紋,這些痕跡很難被擦除。
由於“超級Cookie”的存在,網際網路匿名性變得更加困難。庫茲涅佐夫表示:“我們已經看到了關於隱私保護的軍備競賽。追蹤網際網路用戶的願望就像是寄生蟲。你瀏覽器中的任何內容都在被網站和廣告主審視,從而實現更多的追蹤。”Mozilla已經在最新版火狐瀏覽器中對此進行了修復,而谷歌則傾向於使Chrome維持原狀。谷歌已經知道了“超級Cookie”帶來的問題,但仍選擇繼續啟用Chrome的https記憶功能。在安全性和隱私保護之間,谷歌選擇了前者。
微軟IE瀏覽器並不存在這樣的問題,因為這款瀏覽器並未內建https記憶功能。格林哈爾還表示,在iOS設備上,“超級Cookie”帶來的問題同樣存在。
央視315曝光
2013年3月15日晚,央視315在行動晚會曝光了網易同意第三方公司加代碼,獲取用戶cookie信息,追蹤用戶上網行為
報導稱,為了對廣告效果進行監測,一些網站的確同意第三方公司加代碼。第三方公司通過植入代碼、獲取cookie,就可以鎖定用戶,精準投放廣告。