cookie之詳解

1.用途:

 

        服務器可以利用Cookies包含信息的任意性來篩選並經常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型的應用是判定註冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續,這些都是Cookies的功用。另一個重要應用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入Cookies,以便在最後付款時提取信息。

 

2.生存週期:

 

        Cookie可以保持登錄信息到用戶下次與服務器的會話,換句話說,下次訪問同一網站時,用戶會發現不必輸入用戶名和密碼就已經登錄了(當然,不排除用戶手工刪除Cookie)。而還有一些Cookie在用戶退出會話的時候就被刪除了,這樣可以有效保護個人隱私。

 

3.識別功能:

 

        如果在一臺計算機中安裝多個瀏覽器,每個瀏覽器都會獨立的空間存放cookie。因爲cookie中不但可以確認用戶,還能包含計算機和瀏覽器的信息,所以一個用戶用不同的瀏覽器登錄或者用不同的計算機登錄,都會得到不同的cookie信息,另一方面,對於在同一臺計算機上使用同一瀏覽器的多用戶羣,cookie不會區分他們的身份,除非他們使用不同的用戶名登錄。


4.工作原理:

 

        一般來說,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支持是透明的,用起來非常方便。

 

5.設置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 三個參數可以用空字符串代換,表示沒有設置;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");
  接收和處理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"];


6.刪除cookie

 

        要刪除一個已經存在的Cookie,有兩個辦法:
  一是調用只帶有name參數的SetCookie,那麼名爲這個name的Cookie 將被從關係戶機上刪掉;另一個辦法是設置Cookie的失效時間爲time()或time()-1,那麼這個Cookie在這個頁面的瀏覽完之後就被刪除了(其實是失效了)。
  要注意的是,當一個Cookie被刪除時,它的值在當前頁在仍然有效的。

 

7.Cookie的安全問題

        Cookie欺騙:
    Cookie記錄着用戶的帳戶ID、密碼之類的信息,如果在網上傳遞,通常使用的是MD5方法加密。這樣經過加密處理後的信息,即使被網絡上一些別有用心的人截獲,也看不懂,因爲他看到的只是一些無意義的字母和數字。然而,現在遇到的問題是,截獲Cookie的人不需要知道這些字符串的含義,他們只要把別人的Cookie向服務器提交,並且能夠通過驗證,他們就可以冒充受害人的身份,登陸網站。這種方法叫做Cookie欺騙。Cookie欺騙實現的前提條件是服務器的驗證程序存在漏洞,並且冒充者要獲得被冒充的人的Cookie信息。目前網站的驗證程序要排除所有非法登錄是非常困難的,例如,編寫驗證程序使用的語言可能存在漏洞。而且要獲得別人Cookie是很容易的,用支持Cookie的語言編寫一小段代碼就可以實現(具體方法見三),只要把這段代碼放到網絡裏,那麼所有人的Cookie都能夠被收集。如果一個論壇允許HTML代碼或者允許使用Flash標籤就可以利用這些技術收集Cookie的代碼放到論壇裏,然後給帖子取一個吸引人的主題,寫上有趣的內容,很快就可以收集到大量的Cookie。在論壇上,有許多人的密碼就被這種方法盜去的。至於如何防範,目前還沒有特效藥,我們也只能使用通常的防護方法,不要在論壇裏使用重要的密碼,也不要使用IE自動保存密碼的功能,以及儘量不登陸不瞭解底細的網站。
  Flash的代碼隱患:
  Flash中有一個getURL()函數,Flash可以利用這個函數自動打開指定的網頁。因此它可能把你引向一個包含惡意代碼的網站。打個比方,當你在自己電腦上欣賞精美的Flash動畫時,動畫幀裏的代碼可能已經悄悄地連上網,並打開了一個極小的包含有特殊代碼的頁面。這個頁面可以收集你的Cookie、也可以做一些其他的事情,比如在你的機器上種植木馬甚至格式化你的硬盤等等。對於Flash的這種行爲,網站是無法禁止的,因爲這是Flash文件的內部行爲。我們所能做到的,如果是在本地瀏覽儘量打開防火牆,如果防火牆提示的向外發送的數據包並不爲你知悉,最好禁止。如果是在Internet上欣賞,最好找一些知名的大網站。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章