1. 程式人生 > >session和cookie作用原理,區別

session和cookie作用原理,區別

Cookie概念

      在瀏覽某些 網站 時,這些網站會把 一些資料存在 客戶端 , 用於使用網站 等跟蹤使用者,實現使用者自定義 功能.

 

    是否設定過期時間:

              如果不設定 過期時間,則表示這個 Cookie生命週期為 瀏覽器會話期間 , 只要關閉瀏覽器,cookie就消失了.

               這個生命期為瀏覽會話期的cookie,就是會話Cookie;

 

     儲存:    一般儲存在 記憶體,不在硬碟;

             如果設定了過期時間, 瀏覽器會把cookie儲存在硬碟上,關閉再開啟瀏覽器, 這些cookie 依然有效直到 超過的設定過期時間;

 

      儲存在硬碟上的Cookie可以在不同的瀏覽器程序間共享,比如兩個IE視窗。

而對於儲存 在記憶體的Cookie,不同的瀏覽器有不同的處理方式。


原理:

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


cookie 用法:

setcookie("user","zy",time()+3600); 設定user為zy,一小時之後失效;
$_COOKIE['user']; 取回user值(名字)
setcookie("user","",time()-3600); 刪除cookie,第二個引數為空,第三個時間設定為小於系統的當前時間即可.
 

或在瀏覽器設定

在使用Cookie時,Cookie自動生成一個文字檔案儲存在IE瀏覽器的Cookie臨時資料夾中,應用瀏覽器刪除Cookie檔案的具體操作步驟為
>選擇IE瀏覽器中的工具/internet選項命令,開啟Internet選項對話方塊,
>在常規選項卡中單擊刪除Cookie按鈕,在彈出的對話方塊中單擊確定按鈕,即可成功刪除全部Cookie檔案.
 

 

 

Session的概念

 
   Session 是存放在伺服器端的類似於HashTable結構(每一種web開發技術的實現可能不一樣,下文直接稱之為HashTable)來存放使用者資料;

作用:實現網頁之間資料傳遞,是一個儲存在伺服器端的物件集合。

原理:當用戶請求一個Asp.net頁面時,系統將自動建立一個Session;退出應用程式或關閉伺服器時,該Session撤銷。系統在建立Session時將為其分配一個長長的字串標識,以實現對Session進行管理與跟蹤。

        session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。

 

       儲存:

            儲存在Server段的記憶體程序中的,而這個程序相當不穩定,經常會重啟,這樣重啟的話,就會造成Session失效,使用者就必須要重新登入,使用者體驗相當差,比如使用者在填寫資料,快要結束的時候Session失效,直接跳到登入頁面;

           

 

是否已經建立過session:


當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識(稱為session id),

如果已包含則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來....使用(檢索不到,會新建一個),

如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與此session相關聯的session id,

session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存。

(總結: 建立一個session時,伺服器看這個客戶端 是否包含session標識, 是的話按照session id把session檢索出來,否則就得 新建一個.)

 

     Session的客戶端實現形式(即Session ID的儲存方法):

 

一般瀏覽器提供了兩種方式來儲存,還有一種是程式設計師使用html隱藏域的方式自定義實現:

[1] 使用Cookie來儲存,這是最常見的方法,本文“記住我的登入狀態”功能的實現正式基於這種方式的。

伺服器通過設定Cookie的方式將Session ID傳送到瀏覽器。

如果我們不設定這個過期時間,那麼這個Cookie將不存放在硬碟上,當瀏覽器關閉的時候,Cookie就消失了,這個Session ID就丟失了。

如果我們設定這個時間為若干天之後,那麼這個Cookie會儲存在客戶端硬碟中,即使瀏覽器關閉,這個值仍然存在,下次訪問相應網站時,同 樣會發送到伺服器上。


[2] 使用URL附加資訊的方式,也就是像我們經常看到JSP網站會有aaa.jsp?JSESSIONID=*一樣的。這種方式和第一種方式裡面不設定Cookie過期時間是一樣的。(URL重寫,就是把session id直接附加在URL路徑的後面。)


[3] 第三種方式是在頁面表單裡面增加隱藏域,這種方式實際上和第二種方式一樣,只不過前者通過GET方式傳送資料,後者使用POST方式傳送資料。但是明顯後者比較麻煩。

表單隱藏欄位就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。比如: 
<form name="testform" action="/xxx"> 
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
<input type="text"> 
</form> 
實際上這種技術可以簡單的用對action應用URL重寫來代替。

 

 

 session 用法:
          使用者資訊儲存到session前,先啟動;
             session_start();                     啟動session
             $_SESSION['user']="zy";      設定使用者名稱
             unset($_SESSION['user']);    銷燬使用者名稱
             session_destory();                失去已經儲存的session的資料

 

cookie 和session 的區別:


1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上.

       簡單的說,當你登入一個網站的時候,如果web伺服器端使用的是session,那麼所有的資料都儲存在伺服器上面,

客戶端每次請求伺服器的時候會發送 當前會話的session_id,伺服器根據當前session_id判斷相應的使用者資料標誌,以確定使用者是否登入,或具有某種許可權。

由於資料是儲存在伺服器 上面,所以你不能偽造,但是如果你能夠獲取某個登入使用者的session_id,用特殊的瀏覽器偽造該使用者的請求也是能夠成功的。

session_id是服務 器和客戶端連結時候隨機分配的,一般來說是不會有重複,但如果有大量的併發請求,也不是沒有重複的可能性,我曾經就遇到過一次。

登入某個網站,開始顯示的 是自己的資訊,等一段時間超時了,一重新整理,居然顯示了別人的資訊。


Session是由應用伺服器維持的一個伺服器端的儲存空間,使用者在連線伺服器時,會由伺服器生成一個唯一的SessionID,用該SessionID 為識別符號來存取伺服器端的Session儲存空間。而SessionID這一資料則是儲存到客戶端,用Cookie儲存的,使用者提交頁面時,會將這一 SessionID提交到伺服器端,來存取Session資料。這一過程,是不用開發人員干預的。所以一旦客戶端禁用Cookie,那麼Session也會失效。


2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。


3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能考慮到減輕伺服器效能方面,應當使用COOKIE。


4、單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。(Session物件沒有對儲存的資料量的限制,其中可以儲存更為複雜的資料型別)

 

 

 

 

  注意:

      session很容易失效,使用者體驗很差;

      雖然cookie不安全,但是可以加密 ;

      cookie也分為永久 和暫時 存在的;

      瀏覽器 有禁止cookie功能 ,但一般使用者都不會設定;

     一定要設定失效時間,要不然瀏覽器關閉就消失了;

      例如:

            記住密碼功能就是使用永久cookie寫在客戶端電腦,下次登入時,自動將cookie資訊附加發送給服務端。

            application是全域性性資訊,是所有使用者共享的資訊,如可以記錄有多少使用者現在登入過本網站,並把該資訊展示個所有使用者。

 

 

 兩者最大的區別在於生存週期,一個是IE啟動到IE關閉.(瀏覽器頁面一關 ,session就消失了)


一個是預先設定的生存週期,或永久的保存於本地的檔案。(cookie)