COOKIE與SESSION比較

最近發現寫博客也是提高學習效率的有效途徑之一。好記性不如爛筆頭,歸納總結時,你會發現總有一些東西你認爲很熟了,它卻在細微處諷刺你的錯誤。我學習COOKIE與SESSION時,幾乎把社區所有相關的帖子都下載了,研究過後,總結了這麼點東西,權做備案,日後需要再慢慢查閱!如果有人覺得這篇博客裏的內容似曾相識也不要奇怪,這只是筆記,沒有侵犯版權的意思。歡迎大家來指點錯誤,我們一起來完善這個課題。


1、HTTP協議本身是無狀態的。


   我們上網都要靠HTTP協議傳遞信息。比如我們在瀏覽器裏鍵入:www.bokee.com這個網址並回車,你會發現網址會變成:http://www.bokee.com,其原因就是瀏覽的網頁是基於http協議的。http協議無法記錄用戶經常上哪些網站,有什麼愛好,也無法記錄用戶的ID帳號和密碼。這就是所謂的HTTP協議無狀態。HTTP協議本身是無狀態的,這與HTTP協議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄彼此過去的行爲,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關係一樣,你認得它們,它們則肯定認不得你。


2、怎樣理解cookie和session?


   由於cookie和session關係密切,這裏我們一併介紹。


   打個比方:在河南時,我常到一家熟食店買饞嘴鴨,該店老闆爲了促進銷售,特發佈“每購滿10只即可免費贈送一隻”的優惠措施。除了家裏有什麼紅白喜事要饗客之外,應該不會有人一次性購買10只烤鴨吧?所以老闆得想個法子來記錄顧客的消費數量,這裏總共有三種方案:


   Ⅰ、老闆記住每一個顧客的消費數量,等到顧客消費滿10只的時候自動奉送一隻。這好比HTTP協議本身是有狀態的,可以記住顧客的活動行爲。但遺憾的是,出於種種考慮http協議本身是不能有狀態的,老闆自個也沒有這麼超常的記憶力,故這種方案行不通!


   Ⅱ、老闆發給顧客一張積分卡,上面記錄着消費的數量,一般還有個有效期限。每次買烤鴨時,如果顧客出示這張卡片,老闆就知道這位顧客曾經光顧過小店。這種做法就是在客戶端保持狀態,好比是cookie技術。打開(windows系統)C:\Documents and Settings\用戶名\Cookies,你會發現一些*.txt格式的小文件,這就是你瀏覽某些網站,它們發給你的“積分卡”(cookies)。


   Ⅲ、老闆發給顧客一張會員卡,除了卡號之外什麼信息也不紀錄,每次買烤鴨時,如果顧客出示該卡片,則老闆搬出店裏的劃名冊,找到你的卡號並加1個積分。這種做法就是在服務器端保持狀態。


好比是session技術。


     cookie和session最大的區別在於: cookie是把積分卡發給顧客,上面記錄了顧客所有的消費信息。Session則是把只有卡號(session id)的積分卡發給顧客,自家記錄了顧客所有的消費信息。Cookie是保存在客戶端的;session是保存在服務器端,而session id則是保存在客戶端,通常也是一個cookie小文件,由於這個小文件除了session id(好比卡號)外什麼也沒有,因此比cookie安全多了。


3、cookie和session有什麼用?


   常見的用法,比如在有些網站下載東西需要會員先登陸。http協議本身是無狀態的,無法得知顧客是否已經登陸,怎麼辦呢?cookie和session就可以知道。再比如網上購物,購物車怎麼知道顧客挑選過哪些商品呢?cookie和session也可以記錄。總而言之,cookie和session就是能夠記錄顧客狀態的技術,儘管二者屬於不同的技術,但只要cookie能做到的,session也能做到!COOKIE攻略


1、什麼是cookie?


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


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


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


      按照Netscape官方文檔中的定義,Cookie是在HTTP協議下,服務器或腳本可以維護客戶工作站上信息的一種方式。Cookie是由Web服務器保存在用戶瀏覽器上的小文件,它可以包含有關用戶的信息(如身份識別號碼、密碼、用戶在Web站點購物的方式或用戶訪問該站點的次數)。無論何時用戶鏈接到服務器,Web站點都可以訪問Cookie信息。


   如果你使用的是windows系統,那麼請打開C:\Documents and Settings\用戶名\Cookies,你會發現該目錄下有好多*.txt格式的小文件。那就是cookie文件。當然,在該目錄下你也可能什麼都發現不了,那時因爲你新裝了系統或者從未瀏覽過因特網,也或者你的瀏覽器禁用了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的優秀品質,大多數人還是非常樂意使用它的。


     對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的支持。


2、Cookie工作原理?


    當客戶訪問某個基於PHP技術的網站時,在PHP中可以使用setcookie函數生成一個cookie,系統經處理把這個cookie發送到客戶端並保存在C:\Documents and Settings\用戶名\Cookies目錄下。cookie是 HTTP標頭的一部分, 因此setcookie函數必須在任何內容送到瀏覽器之前調用。這種限制與header()函數一樣(如需瞭解head()函數,請自行查閱)。當客戶再次訪問該網站時,瀏覽器會自動把C:\Documents and Settings\用戶名\Cookies目錄下與該站點對應的cookie發送到服務器,服務器則把從客戶端傳來的cookie將自動地轉化成一個PHP變量。在PHP5中,客戶端發來的cookie將被轉換成全局變量。你可以通過$_COOKIE[‘xxx’]讀取。


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


3、Cookie常見函數


● SetCookie 函數創建了一個Cookie,並且把它附加在HTTP頭的後面。必須注意的一點是:Cookie是HTTP協議頭的一部分,用於瀏覽器和服務器之間傳遞信息,所以必須在任何屬於HTML文件本身的內容輸出之前調用SetCookie函數,調用該函數前即使有空格、空白行都不行。如果setCookie()認了第二,就沒有哪個元素敢認第一。使用setcookie()函數的前提是客戶瀏覽器支持cookie,如果客戶將之禁用的話,setcookie()也就英雄無用武之地了。


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


參數說明:


   name;設置cookie變量的名稱。


   value;設置cookie的值。


   expire;設置cookie過期時間。如果要把cookie保存爲瀏覽器進程,即瀏覽器關閉後就失效。那麼可以直接把expiretime設爲0。Eg:setcookie(“name”,”value”,0)。該參數不設置的話,關閉瀏覽器也能結束一個cookie。


    path:表示web服務器上的目錄,默認爲被調用頁面所在目錄. 這裏還有一點要說明的,比如你的站點有幾個不同的目錄(比如一個購物目錄,一個論壇目錄),那麼如果只用不帶路徑的Cookie的話,在一個目錄下的頁面裏設的Cookie在另一個目錄的頁面裏是看不到的,也就是說,Cookie是面向路徑的。實際上,即使沒有指定路徑,WEB服務器會自動傳遞當前的路徑給瀏覽器的,指定路徑會強制服務器使用設置的路徑。解決這個問題的辦法是在調用SetCookie時加上路徑和域名,域名的格式可以是“http://www.phpuser.com/”,也可是“.phpuser.com”。 SetCookie函數裏表示value的部分,在傳遞時會自動被encode,也就是說,如果value的值是“test value”在傳遞時就變成了“test%20value”,跟URL的方法一樣。當然,對於程序來說這是透明的,因爲在PHP接收Cookie的值時會自動將其decode。


    domain:cookie可以使用的域名,默認爲被調用頁面的域名。這個域名必須包含兩個".",所以如果你指定你的頂級域名,你必須用".mydomain.com" 。設定域名後,必須採用該域名訪問網站cookie纔有效。如果你使用多個域名訪問該頁,那麼這個地方可以爲空或者訪問這個cookie的域名都是一個域下面的。


    secure:如果設爲"1",表示cookie只能被用戶的瀏覽器認爲是安全的服務器所記住。


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


    httponly:如果設爲1,則表示cookie只能被http協議所使用,任何腳本語言,比如javascrīpt是不能獲取PHP所創建的cookie的,這就有效削弱了來自XSS的攻擊。(注意了:這是PHP5纔有的選項,咱也沒有用過。看了官方手冊嘗試着翻譯的,如有疑問,請參考官方手冊。)


   當前設置的Cookie不是立即生效的,而是要等到下一個頁面或刷新後才能看到.這是由於在設置的這個頁面裏Cookie由服務器傳遞給客戶瀏覽器,在下一個頁面或刷新後瀏覽器才能把Cookie從客戶的機器裏取出傳回服務器的原因。


小道消息


16歲德國學生通過cookie破解Hotmail


    德國16歲學生Adriaan Graas對於網絡安全以及Web開發很有興趣,他還發現了Hotmail破解之道。在一週多之後的今天,微軟還未修復該漏洞。


    這名小黑客的想法很簡單,當用戶登陸Hotmail時,系統將會生成一個cookie方便下次登陸。由於該cookie並未綁定IP,因此黑客可以假冒這些cookie並用於登陸,甚至不需要知道受害人的密碼甚至email地址。通過XSS黑客可以插入一段javascrīpt代碼,利用log scrīpt將cookie發送到某個web服務器,腳本可以通過PHP,ASP,CGI等語言編寫。


Cookie應用案例:


●創建一個cookie:


SetCookie()


●創建cookie數組:


其一:


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


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


其二:


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


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


● 接收和處理Cookie


PHP對Cookie的接收和處理的支持非常好,是完全自動的,跟GET,POST變量的原則一樣,特別簡單。


比如設置一個名爲MyCookier的Cookie,PHP會自動從WEB服務器接收的HTTP頭裏把它分析出來,並形成一個可直接使用的全局變量,名爲$_COOKIE[‘MyCookie’],這個變量的值就是Cookie的值。數組同樣適用。


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


echo $_COOKIE[‘MyCookie’];


取出cookie數組的例子:


<?php


// 創建一個cookie數組


setcookie("cookie[three]", "cookiethree");


setcookie("cookie[two]", "cookietwo");


setcookie("cookie[one]", "cookieone");


// 頁面刷新之後,用foreach提取cookie數組。


if (isset($_COOKIE['cookie'])) {


foreach ($_COOKIE['cookie'] as $name => $value) {


   echo "$name : $value <br />\n";


}


}


?>


就這麼簡單。


● 刪除Cookie


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


1、調用只帶有name參數的SetCookie,那麼名爲這個name的Cookie將被從關係戶機上刪掉;


setcookie(“MyCookie”); //刪除MyCookie。


2、設置Cookie的失效時間爲time()或time()-1//time()減多少沒有關係啦,只要是過期時間就行//,那麼這個Cookie在這個頁面的瀏覽完之後就被刪除了(其實是失效了)。例如:


    setcookie(“MyCookie”,”Value”,time()-1); //刪除MyCookie。


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


    如果要把cookie保存爲瀏覽器進程,即瀏覽器關閉後就失效。那麼可以直接把expiretime設爲0。例如:setcookie(“name”,”value”,0)。該參數不設置的話,關閉瀏覽器也能結束一個cookie。


Cookie注意事項


1、SetCookie()之前不能有任何html輸出,它認了第二,沒有哪個元素敢認第一,就是空格,空白行都不行。


2、SetCookie()後,你在當前頁調用echo $_COOKIE["name"]不會有輸出。必須刷新或到下一個頁面纔可以看到Cookie值。原因很簡單。SetCookie()執行之後,往客戶端發送一個cookie,你不刷新或瀏覽下一個頁面,客戶端怎麼把cookie給你送回去呀?瀏覽器創建了一個Cookie後,對於每一個針對該網站的請求,都會在Header中帶着這個Cookie;不過,對於其他網站的請求Cookie是絕對不會跟着發送的。而且瀏覽器會這樣一直髮送,直到Cookie過期爲止。


3、使用Cookie的限制。一個瀏覽器能創建的Cookie數量最多爲30個,並且每個不能超過4KB,每個WEB站點能設置的Cookie總數不能超過20個。 (這是書上看到的說法,應該是一個web站點能創建的Cookie不能超過30個吧,要不然,我機子裏的cookie少說也上百了,請達人指教!)


4、Cookie是保存在客戶端的,用戶禁用了Cookie,你的Cookie自然也就沒作用啦!現在的瀏覽器,每當咱發送一個Cookie給客戶端,他就像看門狗一樣給攔截住了,並詢問用戶是否允許Cookie進門。天,用戶又不是專家,有幾個人知道啥叫Cookie呀?搞不好都當病毒拒之門外了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章