php中Cookie及其使用

來源:互聯網
上載者:User
 

Cookie技術是一個非常有爭議的技術,自經誕生它就成了廣大網路使用者和Web開發人員的
一個爭論焦點。有一些網路使用者,甚至包括一些資深的Web專家也對它的產生和推廣感到不滿,這倒不是因為
Cookie技術的功能太弱或別的技術效能上的原因,而僅僅是因為他們覺得Cookie 的使用,對網路使用者的隱私
構成了危害。因為Cookie是由Web伺服器儲存在使用者瀏覽器上的小文字檔,它包含有關使用者的資訊(如身份
識別號碼、密碼、使用者在Web網站上購物的方式或使用者訪問該網站的次數)。 

  那麼Cookie 技術究竟怎樣呢。是否真的給網路使用者帶來了個人隱私的危害呢。還是讓我們看了下面的內
容,再做回答吧。 

  (1)Cookie技術簡介 

   在WEB技術發展史上,Cookie技術的出現是一個重大的變革。最先是Netscape在它的Netscape Navigator
瀏覽器中引入了Cookie技術,從那時起,World Wide Web 協會就開始支援Cookie標準。以後又經過微軟的大
力推廣(因為微軟的IIS Web伺服器所採用的ASP技術很大程度的使用了Cookie技術),即在微軟的Internet
Explorer瀏覽器中完全支援Cookie技術。到現在,絕大多數的瀏覽器都支援Cookie技術,或者至少相容Cookie
技術的使用。 

  1)什麼是Cookie。 

  按照Netscape官方文檔中的定義,Cookie是在HTTP協議下,伺服器或指令碼可以維護客戶工作站上資訊的
一種方式。Cookie 是由Web伺服器儲存在使用者瀏覽器上的小文字檔,它可以包含有關使用者的資訊(如身份
識別號碼、密碼、使用者在Web網站購物的方式或使用者訪問該網站的次數)。無論何時使用者連結到伺服器,Web
網站都可以訪問Cookie資訊。 

  通俗地講,瀏覽器用一個或多個限定的檔案來支援Cookie。這些檔案在使用Windows作業系統的機器上叫
做Cookie 檔案,在Macintosh機器上叫做magic Cookie 檔案,這些檔案被網站用來在上面儲存Cookie資料。
網站可以在這些Cookie 檔案中插入資訊,這樣對有些網路使用者就有些副作用。有些使用者認為這造成了對個人
隱私的侵犯,更糟的是,有些人認為Cookie是對個人空間的侵佔,而且會對使用者的電腦帶來安全性的危害。 

  目前有些Cookie 是臨時的,另一些則是持續的。臨時的Cookie只在瀏覽器上儲存一段規定的時間,一旦
超過規定的時間該Cookie就會被系統清除。例如在PHP中Cookie被用來跟蹤使用者進程直到使用者離開網站。持續
的Cookie則儲存在使用者的Cookie檔案中,下一次使用者返回時,仍然可以對它進行調用。 

  在Cookie檔案中儲存Cookie,一些使用者會過分地認為這將帶來很大的問題。主要是有些使用者擔心Cookie
會跟蹤使用者網上衝浪的習慣,譬如使用者喜愛到那些類型的網站、愛從事些什麼活動等。害怕這種個人資訊一
旦落入一些別有用心的傢伙手中,那麼個人也就可能成為一大堆廣告垃圾的對象,甚至遭到意外的損害。不
過,這種擔心壓根兒不會發生,因為網站以外的使用者是無法跨過網站來獲得Cookie資訊的。所以想以這種目
的來應用Cookie是不可能的。不過,由於一些使用者錯誤的理解以及“以訛傳訛”,一些瀏覽器開發商別無選
擇,只好作出相識的響應(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie 的選
項)。 

  對Cookie技術期待了這麼久的結果是,迫使許多瀏覽器開發商在它們的瀏覽器中提供了對Cookie的靈活
性控制功能。例如,目前的兩大主流瀏覽器Netscape Navigator 和 Internet Explorer是這樣處理Cookie
的:Netscape Navigator4.0不但可以接受Cookie進行警告,而且還可以屏蔽掉Cookie;InternetExplorer3.0
也可以屏蔽Cookie,但在Internet Explorer4.0中就只能進行接受警告而沒有提供屏蔽選項,不過在Internet
Explorer4.0之後的更新版本中又加入了屏蔽Cookie的功能選項。 

  此外,很多最新的技術甚至已經可以在不能屏蔽Cookie的瀏覽器上進行Cookie的屏蔽了。例如,可以通
過將Cookie檔案設定成不同的類型來限制Cookie的使用。但是,非常不幸地是,要是你想完全屏蔽Cookie的
話,肯定會因此拒絕許多的網站頁面。因為當今已經有許多Web網站開發人員愛上了Cookie技術的強大功能,
例如Session對象的使用就離不開Cookie的支援。 

  儘管今天仍有一些網路使用者對於Cookie的爭論樂此不倦,但是對於絕大多數的網路使用者來說還是傾向於
接受Cookie的。因此,我們盡可以放心地使用Cookie技術來開發我們的WEB頁面。 

  2)Cookie是怎樣工作的。 

  要瞭解Cookie,必不可少地要知道它的工作原理。一般來說,Cookie通過HTTP Headers從伺服器端返回
到瀏覽器上。首先,伺服器端在響應中利用Set-Cookie header來建立一個Cookie ,然後,瀏覽器在它的請
求中通過Cookie header包含這個已經建立的Cookie,並且反它返回至伺服器,從而完成瀏覽器的論證。 

  例如,我們建立了一個名字為login的Cookie來包含訪問者的資訊,建立Cookie時,伺服器端的Header 
如下面所示,這裡假設訪問者的註冊名是“Michael Jordan”,同時還對所建立的Cookie的屬性如path、
domain、expires等進行了指定。 

  Set-Cookie:login=Michael Jordan;path=/;domain=msn.com; 
  expires=Monday,01-Mar-99 00:00:01 GMT 

  上面這個Header會自動在瀏覽器端電腦的Cookie檔案中添加一條記錄。瀏覽器將變數名為“login”
的Cookie賦值為“Michael Jordon”。注意,在實際傳遞過程中這個Cookie的值是經過了URLEncode方法的
URL編碼操作的。 這個含有Cookie值的HTTP Header被儲存到瀏覽器的Cookie檔案後,Header就通知瀏覽器
將Cookie通過請求以忽略路徑的方式返回到伺服器,完成瀏覽器的認證操作。 

  此外,我們使用了Cookie的一些屬性來限定該Cookie的使用。例如Domain屬效能夠在瀏覽器端對Cookie
發送進行限定,具體到上面的例子,該Cookie只能傳達室到指定的伺服器上,而決不會跑到其他的如
www.hp.com的Web網站上去。Expires屬性則指定了該Cookie儲存的時間期限,例如上面的Cookie在瀏覽器上
只儲存到1999年3月1日1秒。當然,如果瀏覽器上Cookie 太多,超過了系統所允許的範圍,瀏覽器將自動對
它進行刪除。至於屬性Path,用來指定Cookie將被發送到伺服器的哪一個目錄路徑下。 

  說明:瀏覽器建立了一個Cookie後,對於每一個針對該網站的請求,都會在Header中帶著這個Cookie;
不過,對於其他網站的請求Cookie是絕對不會跟著發送的。而且瀏覽器會這樣一直發送,直到Cookie到期為止。 

  上一部分講了有關Cookie的技術背景,這部分來說說在PHP裡如何設定、使用、刪除Cookie,及Cookie
的一些限制。PHP對Cookie支援是透明的,用起來非常方便。 

  1、設定Cookie

  PHP用SetCookie函數來設定Cookie。必須注意的一點是:Cookie是HTTP協議頭的一部分,用於瀏覽器和
伺服器之間傳遞資訊,所以必須在任何屬於HTML檔案本身的內容輸出之前調用Cookie函數。SetCookie 函數
定義了一個Cookie,並且把它附加在HTTP頭的後面,SetCookie函數的原型如下:

int SetCookie(string name, string value, int expire, string path, 
string domain, int secure); 

  除了name之外所有的參數都是可選的。value,path,domain 三個參數可以用Null 字元串代換,表示沒有設
置;expire和 secure兩個參數是數值型的,可以用0表示。expire參數是一個標準的Unix時間標記,可以用
time()或mktime() 函數取得,以秒為單位。secure參數表示這個Cookie是否通過加密的HTTPS協議在網路上
傳輸。 

  當前設定的Cookie 不是立即生效的,而是要等到下一個頁面時才能看到.這是由於在設定的這個頁面裡
Cookie由伺服器傳遞給客戶瀏覽器,在下一個頁面瀏覽器才能把Cookie從客戶的機器裡取出傳回伺服器的原
因。在同一個版面設定Cookie,實際是從後往前,所以如果要在插入一個新的Cookie之前刪掉一個,你必須
先寫插入的語句,再寫刪除的語句,否則可能會出現不希望的結果。 

  來看幾個例子:

  簡單的:

SetCookie("MyCookie", "Value of MyCookie"); 

  帶失效時間的: 

SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小時 

  什麼都有的: 

SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1); 

  這裡還有一點要說明的,比如你的網站有幾個不同的目錄,那麼如果只用不帶路徑的Cookie的話,在一
個目錄下的頁面裡設的Cookie在另一個目錄的頁面裡是看不到的,也就是說,Cookie是面向路徑的。實際上,
即使沒有指定路徑,WEB 伺服器會自動傳遞當前的路徑給瀏覽器的,指定路徑會強制服務器使用設定的路徑。
解決這個問題的辦法是在調用SetCookie時加上路徑和網域名稱,網域名稱的格式可以是“www.phpuser.com”,也可
是“.phpuser.com”。 

  SetCookie函數裡表示value的部分,在傳遞時會自動被encode,也就是說,如果value的值是“test 
value”在傳遞時就變成了“test%20value”,跟URL的方法一樣。當然,對於程式來說這是透明的,因為在
PHP接收Cookie的值時會自動將其decode。 

  如果要設定同名的多個Cookie,要用數組,方法是: 

SetCookie("CookieArray[]", "Value 1"); 
SetCookie("CookieArray[]", "Value 2"); 

  或 

SetCookie("CookieArray[0]", "Value 1"); 
SetCookie("CookieArray[1]", "Value 2"); 

  2、接收和處理Cookie 

  PHP對Cookie的接收和處理的支援非常好,是完全自動的,跟FORM變數的原則一樣,特別簡單。比如設
置一個名為MyCookier的Cookie,PHP會自動從WEB伺服器接收的HTTP頭裡把它分析出來,並形成一個與普通
變數一樣的變數,名為$myCookie,這個變數的值就是Cookie的值。數組同樣適用。另外一個辦法是引用PHP
的全域變數$HTTP_COOKIE_VARS數組。 

  分別舉例如下:(假設這些都在以前的頁面裡設定過了,並且仍然有效) 

echo $MyCookie; 
echo $CookieArray[0]; 
echo count($CookieArray); 
echo $HTTP_COOKIE_VARS["MyCookie"]; 

  就這麼簡單。 

  3、刪除Cookie 

  要刪除一個已經存在的Cookie,有兩個辦法: 

  一是調用只帶有name參數的SetCookie,那麼名為這個name的Cookie 將被從關係戶機上刪掉;另一個辦
法是設定Cookie的失效時間為time()或time()-1,那麼這個Cookie在這個頁面的瀏覽完之後就被刪除了(其
實是失效了)。 

  要注意的是,當一個Cookie被刪除時,它的值在當前頁在仍然有效。 

  4、使用Cookie的限制 

  首先是必須在HTML檔案的內容輸出之前設定; 
  其次不同的瀏覽器對Cookie的處理不一致,且有時會出現錯誤的結果。比如:MS IE+SERVICE PACK 1
不能正確處理帶網域名稱和路徑的Cookie ,Netscape Communicator 4.05和MS IE 3.0不能正確處理不帶路徑和
時間的Cookie。至於MS IE 5 好象不能處理帶網域名稱、路徑和時間的Cookie。這是我在設計本站的頁面時發現
的。 
  第三個限制是在用戶端的。一個瀏覽器能建立的Cookie數量最多為30個,並且每個不能超過4KB,每個WEB
網站能設定的Cookie總數不能超過20個。 

  關於Cookie的話題,就說到這兒了。 

  (由於Cookie最初由Netscape定義的,所以附上Netscape公司關於Cookie的官方原始定義的網址:
_spec.html" target=_blank>http://www.netscape.com/newsref
/std/cookie_spec.html)

Cookie技術是一個非常有爭議的技術,自經誕生它就成了廣大網路使用者和Web開發人員的
一個爭論焦點。有一些網路使用者,甚至包括一些資深的Web專家也對它的產生和推廣感到不滿,這倒不是因為
Cookie技術的功能太弱或別的技術效能上的原因,而僅僅是因為他們覺得Cookie 的使用,對網路使用者的隱私
構成了危害。因為Cookie是由Web伺服器儲存在使用者瀏覽器上的小文字檔,它包含有關使用者的資訊(如身份
識別號碼、密碼、使用者在Web網站上購物的方式或使用者訪問該網站的次數)。 

  那麼Cookie 技術究竟怎樣呢。是否真的給網路使用者帶來了個人隱私的危害呢。還是讓我們看了下面的內
容,再做回答吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.