1、什么是cookie?
0Cookie技術(shù)是一個非常有爭議的技術(shù),自經(jīng)誕生它就成了廣大網(wǎng)絡(luò)用戶和Web開發(fā)人員的一個爭論焦點。有一些網(wǎng)絡(luò)用戶,甚至包括一些資深的Web專家也對它的產(chǎn)生和推廣感到不滿,這倒不是因為Cookie技術(shù)的功能太弱或別的技術(shù)性能上的原因,而僅僅是因為他們覺得Cookie的使用,對網(wǎng)絡(luò)用戶的隱私構(gòu)成了危害。因為Cookie是由Web服務(wù)器保存在用戶瀏覽器上的小文本文件,它包含有關(guān)用戶的信息(如身份識別號碼、密碼、用戶在Web站點上購物的方式或用戶訪問該站點的次數(shù))。
那么Cookie技術(shù)究竟怎樣呢?是否真的給網(wǎng)絡(luò)用戶帶來了個人隱私的危害呢?還是讓我們看了下面的內(nèi)容,再做回答吧。
在WEB技術(shù)發(fā)展史上,Cookie技術(shù)的出現(xiàn)是一個重大的變革。最先是Netscape在它的Netscape Navigator 瀏覽器中引入了Cookie技術(shù),從那時起,World Wide Web 協(xié)會就開始支持Cookie標(biāo)準(zhǔn)。以后又經(jīng)過微軟的大力推廣(因為微軟的IIS Web服務(wù)器所采用的ASP技術(shù)很大程度的使用了Cookie技術(shù)),即在微軟的Internet Explorer瀏覽器中完全支持Cookie技術(shù)。到現(xiàn)在,絕大多數(shù)的瀏覽器都支持Cookie技術(shù),或者至少兼容Cookie技術(shù)的使用。
按照Netscape官方文檔中的定義,Cookie是在HTTP協(xié)議下,服務(wù)器或腳本可以維護(hù)客戶工作站上信息的一種方式。Cookie是由Web服務(wù)器保存在用戶瀏覽器上的小文件,它可以包含有關(guān)用戶的信息(如身份識別號碼、密碼、用戶在Web站點購物的方式或用戶訪問該站點的次數(shù))。無論何時用戶鏈接到服務(wù)器,Web站點都可以訪問Cookie信息。
如果你使用的是windows系統(tǒng),那么請打開C:\Documents and Settings\用戶名\Cookies,你會發(fā)現(xiàn)該目錄下有好多*.txt格式的小文件。那就是cookie文件。當(dāng)然,在該目錄下你也可能什么都發(fā)現(xiàn)不了,那時因為你新裝了系統(tǒng)或者從未瀏覽過因特網(wǎng),也或者你的瀏覽器禁用了cookie。否則該目錄下總會有點東西的。
通俗地講,瀏覽器用一個或多個限定的文件來支持Cookie。這些文件在使用Windows操作系統(tǒng)的機(jī)器上叫做Cookie文件,在Macintosh 機(jī)器上叫做magic Cookie 文件,這些文件被網(wǎng)站用來在上面存儲Cookie數(shù)據(jù)。網(wǎng)站可以在這些Cookie文件中插入信息,這樣對有些網(wǎng)絡(luò)用戶就有些副作用。有些用戶認(rèn)為這造成了對個人隱私的侵犯,更糟的是,有些人認(rèn)為Cookie是對個人空間的侵占,而且會對用戶的計算機(jī)帶來安全性的危害。
目前有些Cookie是臨時的,另一些則是持續(xù)的。臨時的Cookie只在瀏覽器上保存一段規(guī)定的時間,一旦超過規(guī)定的時間該Cookie就會被系統(tǒng)清除。例如在PHP中Cookie被用來跟蹤用戶進(jìn)程直到用戶離開網(wǎng)站。持續(xù)的Cookie則保存在用戶的Cookie文件中,下一次用戶返回時,仍然可以對它進(jìn)行調(diào)用。
在Cookie文件中保存Cookie,一些用戶會過分地認(rèn)為這將帶來很大的問題。主要是有些用戶擔(dān)心Cookie會跟蹤用戶網(wǎng)上沖浪的習(xí)慣,譬如用戶喜愛到那些類型的站點、愛從事些什么活動等。害怕這種個人信息一旦落入一些別有用心的家伙手中,那么個人也就可能成為一大堆廣告垃圾的對象,甚至遭到意外的損害。不過,這種擔(dān)心壓根兒不會發(fā)生,因為網(wǎng)站以外的用戶是無法跨過網(wǎng)站來獲得Cookie信息的。所以想以這種目的來應(yīng)用Cookie是不可能的。不過,由于一些用戶錯誤的理解以及“以訛傳訛”,一些瀏覽器開發(fā)商別無選擇,只好作出相適的響應(yīng)(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie的選項)。個人認(rèn)為,無風(fēng)不起浪,如果網(wǎng)站程序員沒有嚴(yán)謹(jǐn)思路的話,cookie確實也存在些許安全問題,不過這些瑕疵并不足以掩蓋cookie的優(yōu)秀品質(zhì),大多數(shù)人還是非常樂意使用它的。
對Cookie技術(shù)期待了這么久的結(jié)果是,迫使許多瀏覽器開發(fā)商在它們的瀏覽器中提供了對Cookie的靈活性控制功能。例如,目前的兩大主流瀏覽器 Netscape Navigator 和 Internet Explorer是這樣處理Cookie的:Netscape Navigator4.0不但可以接受Cookie進(jìn)行警告,而且還可以屏蔽掉Cookie;InternetExplorer3.0也可以屏蔽 Cookie,但在Internet Explorer4.0中就只能進(jìn)行接受警告而沒有提供屏蔽選項,不過在Internet Explorer4.0之后的更新版本中又加入了屏蔽Cookie的功能選項。
此外,很多最新的技術(shù)甚至已經(jīng)可以在不能屏蔽Cookie的瀏覽器上進(jìn)行Cookie的屏蔽了。例如,可以通過將Cookie文件設(shè)置成不同的類型來限制 Cookie的使用。但是,非常不幸地是,要是你想完全屏蔽Cookie的話,肯定會因此拒絕許多的站點頁面。因為當(dāng)今已經(jīng)有許多Web站點開發(fā)人員愛上了Cookie技術(shù)的強(qiáng)大功能,例如Session對象的使用就離不開Cookie的支持。
2、Cookie工作原理?
當(dāng)客戶訪問某個基于PHP技術(shù)的網(wǎng)站時,在PHP中可以使用setcookie函數(shù)生成一個cookie,系統(tǒng)經(jīng)處理把這個cookie發(fā)送到客戶端并保存在C:\Documents and Settings\用戶名\Cookies目錄下。cookie是 HTTP標(biāo)頭的一部分, 因此setcookie函數(shù)必須在任何內(nèi)容送到瀏覽器之前調(diào)用。這種限制與header()函數(shù)一樣(如需了解head()函數(shù),請自行查閱)。當(dāng)客戶再次訪問該網(wǎng)站時,瀏覽器會自動把C:\Documents and Settings\用戶名\Cookies目錄下與該站點對應(yīng)的cookie發(fā)送到服務(wù)器,服務(wù)器則把從客戶端傳來的cookie將自動地轉(zhuǎn)化成一個 PHP變量。在PHP5中,客戶端發(fā)來的cookie將被轉(zhuǎn)換成全局變量。你可以通過$_COOKIE[‘xxx’]讀取。
盡管今天仍有一些網(wǎng)絡(luò)用戶對于Cookie的爭論樂此不倦,但是對于絕大多數(shù)的網(wǎng)絡(luò)用戶來說還是傾向于接受Cookie的。因此,我們盡可以放心地使用Cookie技術(shù)來開發(fā)我們的WEB頁面。
3、Cookie常見函數(shù)
● SetCookie 函數(shù)創(chuàng)建了一個Cookie,并且把它附加在HTTP頭的后面。必須注意的一點是:Cookie是HTTP協(xié)議頭的一部分,用于瀏覽器和服務(wù)器之間傳遞信息,所以必須在任何屬于HTML文件本身的內(nèi)容輸出之前調(diào)用SetCookie函數(shù),調(diào)用該函數(shù)前即使有空格、空白行都不行。如果setCookie()認(rèn)了第二,就沒有哪個元素敢認(rèn)第一。使用setcookie()函數(shù)的前提是客戶瀏覽器支持cookie,如果客戶將之禁用的話,setcookie()也就英雄無用武之地了。
int SetCookie(string name, string value, int expire, string path, string domain, int secure,bool httponly);
參數(shù)說明:
name;設(shè)置cookie變量的名稱。
value;設(shè)置cookie的值。
expire;設(shè)置cookie過期時間。如果要把cookie保存為瀏覽器進(jìn)程,即瀏覽器關(guān)閉后就失效。那么可以直接把expiretime設(shè)為0。 Eg:setcookie(“name”,”value”,0)。該參數(shù)不設(shè)置的話,關(guān)閉瀏覽器也能結(jié)束一個cookie。
path:表示web服務(wù)器上的目錄,默認(rèn)為被調(diào)用頁面所在目錄. 這里還有一點要說明的,比如你的站點有幾個不同的目錄(比如一個購物目錄,一個論壇目錄),那么如果只用不帶路徑的Cookie的話,在一個目錄下的頁面里設(shè)的Cookie在另一個目錄的頁面里是看不到的,也就是說,Cookie是面向路徑的。實際上,即使沒有指定路徑,WEB服務(wù)器會自動傳遞當(dāng)前的路徑給瀏覽器的,指定路徑會強(qiáng)制服務(wù)器使用設(shè)置的路徑。解決這個問題的辦法是在調(diào)用 SetCookie時加上路徑和域名,域名的格式可以是“http://www.phpuser.com/”,也可是“.phpuser.com”。 SetCookie函數(shù)里表示value的部分,在傳遞時會自動被encode,也就是說,如果value的值是“test value”在傳遞時就變成了“test%20value”,跟URL的方法一樣。當(dāng)然,對于程序來說這是透明的,因為在PHP接收Cookie的值時會自動將其decode。
domain:cookie可以使用的域名,默認(rèn)為被調(diào)用頁面的域名。這個域名必須包含兩個".",所以如果你指定你的頂級域名,你必須用 ".mydomain.com" 。設(shè)定域名后,必須采用該域名訪問網(wǎng)站cookie才有效。如果你使用多個域名訪問該頁,那么這個地方可以為空或者訪問這個cookie的域名都是一個域下面的。
secure:如果設(shè)為"1",表示cookie只能被用戶的瀏覽器認(rèn)為是安全的服務(wù)器所記住。
除了name之外所有的參數(shù)都是可選的。value,path,domain三個參數(shù)可以用空字符串""代換,表示沒有設(shè)置;expire 和 secure兩個參數(shù)是數(shù)值型的,可以用0表示。expire參數(shù)是一個標(biāo)準(zhǔn)的Unix時間標(biāo)記,可以用time()或mktime()函數(shù)取得,以秒為單位。secure參數(shù)表示這個Cookie是否通過加密的HTTPS協(xié)議在網(wǎng)絡(luò)上傳輸。
httponly:如果設(shè)為1,則表示cookie只能被http協(xié)議所使用,任何腳本語言,比如javascrīpt是不能獲取PHP所創(chuàng)建的 cookie的,這就有效削弱了來自XSS的攻擊。(注意了:這是PHP5才有的選項,咱也沒有用過。看了官方手冊嘗試著翻譯的,如有疑問,請參考官方手冊。)
當(dāng)前設(shè)置的Cookie不是立即生效的,而是要等到下一個頁面或刷新后才能看到.這是由于在設(shè)置的這個頁面里Cookie由服務(wù)器傳遞給客戶瀏覽器,在下一個頁面或刷新后瀏覽器才能把Cookie從客戶的機(jī)器里取出傳回服務(wù)器的原因。
小道消息
Cookie應(yīng)用案例:
●創(chuàng)建一個cookie:
SetCookie()
●創(chuàng)建cookie數(shù)組:
其一:
SetCookie("CookieArray[]", "Value 1");
SetCookie("CookieArray[]", "Value 2");
其二:
SetCookie("CookieArray[0]", "Value 1");
SetCookie("CookieArray[1]", "Value 2");
● 接收和處理Cookie
PHP對Cookie的接收和處理的支持非常好,是完全自動的,跟GET,POST變量的原則一樣,特別簡單。
比如設(shè)置一個名為MyCookier的Cookie,PHP會自動從WEB服務(wù)器接收的HTTP頭里把它分析出來,并形成一個可直接使用的全局變量,名為$_COOKIE[‘MyCookie’],這個變量的值就是Cookie的值。數(shù)組同樣適用。
分別舉例如下:(假設(shè)這些都在以前的頁面里設(shè)置過了,并且仍然有效)
echo $_COOKIE[‘MyCookie’];
取出cookie數(shù)組的例子:
<?php
// 創(chuàng)建一個cookie數(shù)組
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
// 頁面刷新之后,用foreach提取cookie數(shù)組。
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br />\n";
}
}
?>
就這么簡單。
● 刪除Cookie
要刪除一個已經(jīng)存在的Cookie,有兩個辦法:
1、調(diào)用只帶有name參數(shù)的SetCookie,那么名為這個name的Cookie將被從關(guān)系戶機(jī)上刪掉;
setcookie(“MyCookie”); //刪除MyCookie。
2、設(shè)置Cookie的失效時間為time()或time()-1//time()減多少沒有關(guān)系啦,只要是過期時間就行//,那么這個Cookie在這個頁面的瀏覽完之后就被刪除了(其實是失效了)。例如:
setcookie(“MyCookie”,”Value”,time()-1); //刪除MyCookie。
要注意的是,當(dāng)一個Cookie被刪除時,它的值在當(dāng)前頁在仍然有效的。
如果要把cookie保存為瀏覽器進(jìn)程,即瀏覽器關(guān)閉后就失效。那么可以直接把expiretime設(shè)為0。例如:setcookie(“name”,”value”,0)。該參數(shù)不設(shè)置的話,關(guān)閉瀏覽器也能結(jié)束一個cookie。
Cookie注意事項
1、SetCookie()之前不能有任何html輸出,它認(rèn)了第二,沒有哪個元素敢認(rèn)第一,就是空格,空白行都不行。
2、SetCookie()后,你在當(dāng)前頁調(diào)用echo $_COOKIE["name"]不會有輸出。必須刷新或到下一個頁面才可以看到Cookie值。原因很簡單。SetCookie()執(zhí)行之后,往客戶端發(fā)送一個cookie,你不刷新或瀏覽下一個頁面,客戶端怎么把cookie給你送回去呀?瀏覽器創(chuàng)建了一個Cookie后,對于每一個針對該網(wǎng)站的請求,都會在Header中帶著這個Cookie;不過,對于其他網(wǎng)站的請求Cookie是絕對不會跟著發(fā)送的。而且瀏覽器會這樣一直發(fā)送,直到 Cookie過期為止。
3、使用Cookie的限制。一個瀏覽器能創(chuàng)建的Cookie數(shù)量最多為30個,并且每個不能超過4KB,每個WEB站點能設(shè)置的Cookie總數(shù)不能超過20個。 (這是書上看到的說法,應(yīng)該是一個web站點能創(chuàng)建的Cookie不能超過30個吧,要不然,我機(jī)子里的cookie少說也上百了,請達(dá)人指教!)
4、Cookie是保存在客戶端的,用戶禁用了Cookie,你的Cookie自然也就沒作用啦!現(xiàn)在的瀏覽器,每當(dāng)咱發(fā)送一個Cookie給客戶端,他就像看門狗一樣給攔截住了,并詢問用戶是否允許Cookie進(jìn)門。天,用戶又不是專家,有幾個人知道啥叫Cookie呀?搞不好都當(dāng)病毒拒之門外了。