from:http://hi.baidu.com/di6yuansu/blog/item/87c11c2473cb322cd50742d6.html

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";
}
}
?&gt;
就這么簡單。
刪除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呀?搞不好都當病毒拒之門外了。