2010年2月21日

PHP的會話管理--Cookie

Cookie的概念
Cookie是一種在客戶瀏覽器端儲存資料並以此來跟蹤和識別用戶的機制,與Session類似,Cookie變數的作用範圍同樣可以整站跨頁面有效,所不同的是,Cookie變數儲存於用戶端的瀏覽器,並可以指定有效時間,而Session變數則在結束網站連結時即告失效。
一般用Cookie來代表由網站伺服器發送出來儲存在用戶端瀏覽器上的小量資訊,從而使得訪客下次又連接該網站時,可從瀏覽器讀回這些資訊。這種機制是很有用的,可以讓瀏覽器訪住訪客的特定資訊,如上次連結的位置、花費的時間或使用者首選項。Cookie就是在瀏覽器目錄中儲存這些資訊的文件檔。

Cookie的傳遞流程是這樣的:
當在瀏覽器位址欄中輸入了一個Web網站的URL位址時,瀏覽器就會向該Web網站發送一個讀取網頁的請求,並將結果在顯示器上顯示。這時該網頁在你的電腦上尋找這個網站設置的Cookie文件,如果找到,瀏覽器會把Cookie文件中的資料連同前面輸入的URL一同發送到網站伺服器。伺服器收到 Cookie資料,就會在它的資料庫中檢索我們的ID、購物記錄、個人喜好等資訊,並記錄下新的內容,增加到資料庫和Cookie文件中。如果沒有檢索到 Cookie或你的Cookie資訊與資料庫中的資訊不符合,則說明我們是第一次瀏覽該網站,伺服器的CGI程式將為我們創建新的ID資訊,並保存到資料庫中。

Cookie是利用了網頁中的HTTP表頭資訊進行傳遞,瀏覽器的每一次網頁請求,都可以伴隨Cookie傳遞。Cookie在電腦上保存的時間是不一樣的,這些都是由伺服器的設置不同決定。Cookie有一個Expires(有效期)屬性,這個屬性決定了Cookie的保存時間,伺服器可以透過設定Expires欄位的數值,來改變Cookie的保存時間,如果不設置該屬性,那麼Cookie只在瀏覽網頁期間有效,關閉瀏覽器,這些Cookie自動消失,絕大多數網站屬於這種情況。

伺服器可以利用Cookie包含資訊的任意性來篩選並經常性維護所記錄的這些資訊,以判斷在HTTP傳輸中的狀態。Cookie最典型的應用是判定註冊用戶是否已經登錄網站,尤其是各大論壇登錄時都有有效時間的選項,使用者可能會得到提示,是否在下一次進入此網站時保留使用者資訊以便簡化登錄手續,這些都是Cookie的功用。另一個重要的應用場合是「購物車」之類處理,用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些資訊都會寫入Cookie,以便在最後付款時提取資訊。

Cookie雖然方便使用,但是在某種程度上已經嚴重危及用戶的隱私和安全。其中的一種方法是:當我們為了市場調查、商品搜索等目的透過搜尋引擎搜到一些陌生網站並連接時,這些網站包含了一種叫做網頁臭蟲的圖片,該圖片透明且只有一個像素大小以便隱藏,它們的作用是向所有連接過此頁面的電腦寫入 Cookie。而後,一些其他網站將讀取這些Cookie資訊,並尋找寫入這些Cookie的網站,就可能發送包含了針對這個網站相關產品廣告的垃圾郵件給我們,給我們的工作和生活帶來騷擾。

另外使用Cookie還會有Cookie欺騙的風險,儘管Cookie沒有病毒那麼危險,但它仍包含了一些敏感資訊:用戶名、電腦名、使用的瀏覽器和曾經連接的網站等,而使用者是不希望這些內容洩漏出去,尤其是當其中還包含有私人資訊的時候。Cookie所記錄的這些資訊,如果在網上傳遞,通常使用的是MD5方法加密以防被他人輕易讀取,雖然這些加密後的資訊在我們看來只是一些毫無意義的字母數字組合,只有伺服器的CGI處理常式才知道它們真正的含義,這些經過加密處理後的資訊,即使被網路上一些別有用心的人截獲,也看不懂,因為他看到的只是一些無意義的字母和數字,然而,問題是,截獲Cookie 的人不需要知道這些字串的含義,他們只要把別人的Cookie向伺服器提交,並且能夠通過驗證,他們就可以冒充受害人的身份,登錄網站。這種方法叫做 Cookie欺騙,Cookie欺騙實現有前提條件是伺服器的驗證程式存在漏洞,並且冒充者要獲得冒充的人Cookie資訊。目前網站的驗證程式要排除所有非法登錄是非常困難的,而且要獲得別人Cookie是很容易的,用支援Cookie的語言編寫一小段代碼就可以實現,只要把這段代碼放到網路裡,那麼所有人的Cookie都能夠被收集。目前還沒有特別的防範方法,我們也只能使用通當的防護方法,不要在論壇裡使用重要的密碼,也不要使用IE自動保存密碼的功能,以及儘量不登錄不瞭解底細的網站。

設置Cookie
PHP在HTTP協定的表頭資訊裡發送Cookie,必須在其他資訊被輸出到瀏覽器前設置Cookie,這和要header()、Session的初始化限制類似。設置Cookie的函式是setcookie()或setrawcookie(),還可以透過向用戶端直接發送HTTP表頭來設置。

接收和處理Cookie
PHP對Cookie的接收和處理的支援非常的好,是完全自動的。我們可以直接用PHP內建超級全域變數$_COOKIE來讀取瀏覽器端的Cookie。

刪除Cookie
可以呼叫只帶有name參數的setcookie()或者把有效時間設為小於當前時間和把值設置為空就可以刪除某個Cookie的值,這個Cookie在這個頁面瀏覽完之後就會被刪除了(其實是失效了)。

沒有留言:

張貼留言