1. 程式人生 > >SESSION 和 COOKIE 的區別及安全性

SESSION 和 COOKIE 的區別及安全性

一,為什麼session,cookie經常會有人提到

做web開發的人基本上都會用session和cookie,但是僅僅只是會用,並不知道session和cookie的真正的工作原理,都只是憑著感覺來猜測。web開發者只要利用它們來完成工作就行了,所以每個人的理解基本都會有大同小異,我想這就是session,cookie經常會被討論的原因。本文也是根據個人經驗,以及個人所學,對session,cookie的一些看法,純屬個人見解,希望得到大家的更正和建議。


二,什麼cookie

cookie分為二種

1,以檔案方式存在硬碟空間上的長期性的cookie

2,停留在瀏覽器所佔記憶體中的臨時性的cookie

瀏覽網站時,你會經常發現網站登入的地方,會有提示,問你是不是要記住自己的登入狀態,像這種情況,登入時填寫的一些資訊會被以檔案的方式存放在客戶端的硬碟上。

當用戶登入後,session會在cookie端產生一個session_id,這個session_id是存於瀏覽器所佔用的記憶體當中。當你關閉瀏覽器後,session_id也要消失了。

cookie採用的是在客戶端保持狀態的方案,它是客戶端的會話狀態的一種儲存機制。它是伺服器在本地機器上儲存的小段文字或者是記憶體中的一段資料,並隨每一個請求傳送至同一個伺服器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie規範。網路伺服器用HTTP頭資訊向客戶端傳送cookies,在客戶終端,瀏覽器解析這些cookies並將它們儲存為一個本地檔案,或者本地記憶體中資料,它會自動將同一伺服器的任何請求縛上這些cookies,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制藉助於cookie機制來達到儲存標識的目的,這樣就可以解決HTTP協議無狀態的缺陷。

三,什麼是session

session是一種伺服器端的資訊管理機制,它把這些檔案資訊以檔案的形勢存放在伺服器的硬碟空間上,這種情況是預設的,可以用memcache把這種資料放到記憶體裡面。請參考web叢集時利用memcache來同步session

當客戶端向伺服器發出請求時,要求伺服器端產生一個session時,伺服器端會先檢查一下,客戶端的cookie裡面有沒有session_id,是否已經過期。如果有這樣的session_id的話,伺服器端會根據cookie裡的session_id把伺服器的session檢索出來。如果沒有這樣的session_id的話,伺服器端會重新建立一個。PHPSESSID是一串加了密的字串,它的生成按照一定的規則來執行。同一客戶端啟動二次session_start的話,session_id是不一樣的。

Host *****************.com
User-Agent Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6
Accept text/css,*/*;q=0.1
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset UTF-8,*
Keep-Alive 115
Connection keep-alive
Referer http://***************.com/
Cookie BX=7f34kbl5d3m3g&b=3&s=9t; AWSUSER_ID=awsuser_id1267685109158r8091; PHPSESSID=us1o22h4iveo4uni3iksabreh4
If-Modified-Since Tue, 29 Jun 2010 07:55:38 GMT

上面是一次請求的頭資訊。

session產生的session_id放在cookie裡面,如果使用者把cookie禁止掉,是不是session也不能用了呢?禁止掉cookie後,session當然可以用,不過通過其他的方式來獲得這個sessionid,比如,可以根在url的後面,或者以表單的形勢提交到伺服器端。從而使伺服器端了解客戶端的狀態。

四,session和cookie誰更安全

就個人而言,我覺得session更安全一點,我以下幾點看法。

1,如果session和cookie一樣安全的話,二者就沒有並要同時存在了,只要cookie就好了,讓客戶端來分提伺服器的負擔,並且對於使用者來說又是透明的。何樂而不為呢。

2,session的sessionID是放在cookie裡,要想功破session的話,第一要功破cookie。功破cookie後,你要得到 sessionID,sessionID是要有人登入,或者啟動session_start才會有,你不知道什麼時候會有人登入。第二,sessionID是加密的,第二次session_start的時候,前一次的sessionID就沒有用了,session過期時sessionid也會失效,想在短時間內功破加了密的 sessionID很難。session是針對某一次通訊而言,會話結束session也就隨著消失了,而真正的cookie存在於客戶端硬碟上的一個文字檔案,誰安全很顯然了。

3,如果session這麼容易被功破,這麼不安全的話,我想現有的絕大部分網站都不安全了。