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這麼容易被功破,這麼不安全的話,我想現有的絕大部分網站都不安全了。

簡單的說,當你登入一個網站的時候,如果web伺服器端使用的是session,那麼所有的資料都儲存在伺服器上,客戶端每次請求伺服器的時候會發送當前會話的sessionid,伺服器根據當前sessionid判斷相應的使用者資料標誌,以確定使用者是否登入或具有某種許可權。由於資料是儲存在伺服器上面,所以你不能偽造,但是如果你能夠獲取某個登入使用者的 sessionid,用特殊的瀏覽器偽造該使用者的請求也是能夠成功的。sessionid是伺服器和客戶端連結時候隨機分配的,一般來說是不會有重複,但如果有大量的併發請求,也不是沒有重複的可能性.

如果瀏覽器使用的是cookie,那麼所有的資料都儲存在瀏覽器端,比如你登入以後,伺服器設定了cookie使用者名稱,那麼當你再次請求伺服器的時候,瀏覽器會將使用者名稱一塊傳送給伺服器,這些變數有一定的特殊標記。伺服器會解釋為cookie變數,所以只要不關閉瀏覽器,那麼cookie變數一直是有效的,所以能夠保證長時間不掉線。如果你能夠截獲某個使用者的 cookie變數,然後偽造一個數據包傳送過去,那麼伺服器還是認為你是合法的。所以,使用 cookie被攻擊的可能性比較大。如果設定了的有效時間,那麼它會將 cookie儲存在客戶端的硬碟上,下次再訪問該網站的時候,瀏覽器先檢查有沒有 cookie,如果有的話,就讀取該 cookie,然後傳送給伺服器。如果你在機器上面儲存了某個論壇 cookie,有效期是一年,如果有人入侵你的機器,將你的 cookie拷走,然後放在他的瀏覽器的目錄下面,那麼他登入該網站的時候就是用你的的身份登入的。所以 cookie是可以偽造的。當然,偽造的時候需要主意,直接copy cookie檔案到 cookie目錄,瀏覽器是不認的,他有一個index.dat檔案,儲存了 cookie檔案的建立時間,以及是否有修改,所以你必須先要有該網站的 cookie檔案,並且要從保證時間上騙過瀏覽器

五、有效期與使用場景?

兩個都可以用來存私密的東西,同樣也都有有效期的說法,區別在於session是放在伺服器上的,過期與否取決於服務期的設定,cookie是存在客戶端的,過去與否可以在cookie生成的時候設定進去。

(1)cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上 (2)cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,如果主要考慮到安全應當使用session (3)session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,如果主要考慮到減輕伺服器效能方面,應當使用COOKIE (4)單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。 (5)所以:將登陸資訊等重要資訊存放為SESSION;其他資訊如果需要保留,可以放在COOKIE中

相關文件: