溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

session和cookie的原理是什么

發(fā)布時(shí)間:2021-02-11 10:11:29 來(lái)源:億速云 閱讀:224 作者:Leah 欄目:web開(kāi)發(fā)

session和cookie的原理是什么?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

Cookie概念

      在瀏覽某些 網(wǎng)站時(shí),這些網(wǎng)站會(huì)把一些數(shù)據(jù)存在客戶端,用于使用網(wǎng)站等跟蹤用戶,實(shí)現(xiàn)用戶自定義功能.

是否設(shè)置過(guò)期時(shí)間:

      如果不設(shè)置 過(guò)期時(shí)間,則表示這個(gè) Cookie生命周期為 瀏覽器會(huì)話期間 , 只要關(guān)閉瀏覽器,cookie就消失了.
      這個(gè)生命期為瀏覽會(huì)話期的cookie,就是會(huì)話Cookie;

存儲(chǔ):   
      一般保存在內(nèi)存,不在硬盤(pán);
      如果設(shè)置了過(guò)期時(shí)間, 瀏覽器會(huì)把cookie保存在硬盤(pán)上,關(guān)閉再打開(kāi)瀏覽器, 這些cookie依然有效直到超過(guò)的設(shè)置過(guò)期時(shí)間;
      存儲(chǔ)在硬盤(pán)上的Cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口。
      而對(duì)于保存 在內(nèi)存的Cookie,不同的瀏覽器有不同的處理方式。

原理:

     如果瀏覽器使用的是 cookie,那么所有的數(shù)據(jù)都保存在瀏覽器端,
     比如你登錄以后,服務(wù)器設(shè)置了 cookie用戶名(username),那么,當(dāng)你再次請(qǐng)求服務(wù)器的時(shí)候,瀏覽器會(huì)將username一塊發(fā)送給服務(wù)器,這些變量有一定的特殊標(biāo)記。
     服務(wù)器會(huì)解釋為 cookie變量。
     所以只要不關(guān)閉瀏覽器,那么 cookie變量便一直是有效的,所以能夠保證長(zhǎng)時(shí)間不掉線。
     如果你能夠截獲某個(gè)用戶的 cookie變量,然后偽造一個(gè)數(shù)據(jù)包發(fā)送過(guò)去,那么服務(wù)器還是認(rèn)為你是合法的。所以使用 cookie被攻擊的可能性比較大。
     如果設(shè)置了的有效時(shí)間,那么它會(huì)將 cookie保存在客戶端的硬盤(pán)上,下次再訪問(wèn)該網(wǎng)站的時(shí)候,瀏覽器先檢查有沒(méi)有 cookie,如果有的話,就讀取該 cookie,然后發(fā)送給服務(wù)器。
     如果你在機(jī)器上面保存了某個(gè)論壇 cookie,有效期是一年,如果有人入侵你的機(jī)器,將你的 cookie拷走,然后放在他的瀏覽器的目錄下面,那么他登錄該網(wǎng)站的時(shí)候就是用你的的身份登錄的。
     所以 cookie是可以偽造的。
     當(dāng)然,偽造的時(shí)候需要主意,直接copy cookie文件到 cookie目錄,瀏覽器是不認(rèn)的,
     他有一個(gè)index.dat文件,存儲(chǔ)了 cookie文件的建立時(shí)間,以及是否有修改,所以你必須先要有該網(wǎng)站的 cookie文件,并且要從保證時(shí)間上騙過(guò)瀏覽器,
     曾經(jīng)在學(xué)校的vbb論壇上面做過(guò)試驗(yàn),copy別人的 cookie登錄,冒用了別人的名義發(fā)帖子,完全沒(méi)有問(wèn)題。
 
cookie 用法:

  setcookie("user","zy",time()+3600); 設(shè)置user為zy,一小時(shí)之后失效;
  $_COOKIE['user'];     取回user值(名字)
  setcookie("user","",time()-3600); 刪除cookie,第二個(gè)參數(shù)為空,第三個(gè)時(shí)間設(shè)置為小于系統(tǒng)的當(dāng)前時(shí)間即可.

  或在瀏覽器設(shè)置

      在使用Cookie時(shí),Cookie自動(dòng)生成一個(gè)文本文件存儲(chǔ)在IE瀏覽器的Cookie臨時(shí)文件夾中,應(yīng)用瀏覽器刪除Cookie文件的具體操作步驟為
      >選擇IE瀏覽器中的工具/internet選項(xiàng)命令,打開(kāi)Internet選項(xiàng)對(duì)話框,
      >在常規(guī)選項(xiàng)卡中單擊刪除Cookie按鈕,在彈出的對(duì)話框中單擊確定按鈕,即可成功刪除全部Cookie文件.
 
Session的概念

      Session 是存放在服務(wù)器端的類(lèi)似于HashTable結(jié)構(gòu)(每一種web開(kāi)發(fā)技術(shù)的實(shí)現(xiàn)可能不一樣,下文直接稱(chēng)之為HashTable)來(lái)存放用戶數(shù)據(jù);

作用:

      實(shí)現(xiàn)網(wǎng)頁(yè)之間數(shù)據(jù)傳遞,是一個(gè)存儲(chǔ)在服務(wù)器端的對(duì)象集合。

原理:

      當(dāng)用戶請(qǐng)求一個(gè)Asp.net頁(yè)面時(shí),系統(tǒng)將自動(dòng)創(chuàng)建一個(gè)Session;退出應(yīng)用程序或關(guān)閉服務(wù)器時(shí),該Session撤銷(xiāo)。系統(tǒng)在創(chuàng)建Session時(shí)將為其分配一個(gè)長(zhǎng)長(zhǎng)的字符串標(biāo)識(shí),以實(shí)現(xiàn)對(duì)Session進(jìn)行管理與跟蹤。
      session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類(lèi)似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。
      
保存:

      存儲(chǔ)在Server段的內(nèi)存進(jìn)程中的,而這個(gè)進(jìn)程相當(dāng)不穩(wěn)定,經(jīng)常會(huì)重啟,這樣重啟的話,就會(huì)造成Session失效,用戶就必須要重新登錄,用戶體驗(yàn)相當(dāng)差,比如用戶在填寫(xiě)資料,快要結(jié)束的時(shí)候Session失效,直接跳到登錄頁(yè)面;

是否已經(jīng)創(chuàng)建過(guò)session:

      當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí)(稱(chēng)為session id),

      如果已包含則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)....使用(檢索不到,會(huì)新建一個(gè)),
 
      如果客戶端請(qǐng)求不包含session id,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,

      session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)session id將被在本次響應(yīng)中返回給客戶端保存。

     (總結(jié): 創(chuàng)建一個(gè)session時(shí),服務(wù)器看這個(gè)客戶端 是否包含session標(biāo)識(shí), 是的話按照session id把session檢索出來(lái),否則就得 新建一個(gè).)

 Session的客戶端實(shí)現(xiàn)形式(即Session ID的保存方法):

     一般瀏覽器提供了兩種方式來(lái)保存,還有一種是程序員使用html隱藏域的方式自定義實(shí)現(xiàn):

     [1] 使用Cookie來(lái)保存,這是最常見(jiàn)的方法,本文“記住我的登錄狀態(tài)”功能的實(shí)現(xiàn)正式基于這種方式的。

     服務(wù)器通過(guò)設(shè)置Cookie的方式將Session ID發(fā)送到瀏覽器。
 
     如果我們不設(shè)置這個(gè)過(guò)期時(shí)間,那么這個(gè)Cookie將不存放在硬盤(pán)上,當(dāng)瀏覽器關(guān)閉的時(shí)候,Cookie就消失了,這個(gè)Session ID就丟失了。

     如果我們?cè)O(shè)置這個(gè)時(shí)間為若干天之后,那么這個(gè)Cookie會(huì)保存在客戶端硬盤(pán)中,即使瀏覽器關(guān)閉,這個(gè)值仍然存在,下次訪問(wèn)相應(yīng)網(wǎng)站時(shí),同 樣會(huì)發(fā)送到服務(wù)器上。


     [2] 使用URL附加信息的方式,也就是像我們經(jīng)??吹絁SP網(wǎng)站會(huì)有aaa.jsp?JSESSIONID=*一樣的。這種方式和第一種方式里面不設(shè)置Cookie過(guò)期時(shí)間是一樣的。(URL重寫(xiě),就是把session id直接附加在URL路徑的后面。)


     [3] 第三種方式是在頁(yè)面表單里面增加隱藏域,這種方式實(shí)際上和第二種方式一樣,只不過(guò)前者通過(guò)GET方式發(fā)送數(shù)據(jù),后者使用POST方式發(fā)送數(shù)據(jù)。但是明顯后者比較麻煩。
     表單隱藏字段就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。比如:
      <form name="testform" action="/xxx">
         <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
         <input type="text">
       </form>
      實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對(duì)action應(yīng)用URL重寫(xiě)來(lái)代替。

session 用法:
        用戶信息保存到session前,先啟動(dòng);
         session_start();                     啟動(dòng)session
         $_SESSION['user']="zy";      設(shè)置用戶名
         unset($_SESSION['user']);    銷(xiāo)毀用戶名
         session_destory();                失去已經(jīng)存儲(chǔ)的session的數(shù)據(jù)

cookie 和session 的區(qū)別:

       1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上.

       簡(jiǎn)單的說(shuō),當(dāng)你登錄一個(gè)網(wǎng)站的時(shí)候,如果web服務(wù)器端使用的是session,那么所有的數(shù)據(jù)都保存在服務(wù)器上面,
       客戶端每次請(qǐng)求服務(wù)器的時(shí)候會(huì)發(fā)送 當(dāng)前會(huì)話的session_id,服務(wù)器根據(jù)當(dāng)前session_id判斷相應(yīng)的用戶數(shù)據(jù)標(biāo)志,以確定用戶是否登錄,或具有某種權(quán)限。
       由于數(shù)據(jù)是存儲(chǔ)在服務(wù)器 上面,所以你不能偽造,但是如果你能夠獲取某個(gè)登錄用戶的session_id,用特殊的瀏覽器偽造該用戶的請(qǐng)求也是能夠成功的。
       session_id是服務(wù) 器和客戶端鏈接時(shí)候隨機(jī)分配的,一般來(lái)說(shuō)是不會(huì)有重復(fù),但如果有大量的并發(fā)請(qǐng)求,也不是沒(méi)有重復(fù)的可能性,我曾經(jīng)就遇到過(guò)一次。
       登錄某個(gè)網(wǎng)站,開(kāi)始顯示的 是自己的信息,等一段時(shí)間超時(shí)了,一刷新,居然顯示了別人的信息。

       Session是由應(yīng)用服務(wù)器維持的一個(gè)服務(wù)器端的存儲(chǔ)空間,用戶在連接服務(wù)器時(shí),會(huì)由服務(wù)器生成一個(gè)唯一的SessionID,用該SessionID 為標(biāo)識(shí)符來(lái)存取服務(wù)器端的Session存儲(chǔ)空間。而SessionID這一數(shù)據(jù)則是保存到客戶端,用Cookie保存的,用戶提交頁(yè)面時(shí),會(huì)將這一 SessionID提交到服務(wù)器端,來(lái)存取Session數(shù)據(jù)。這一過(guò)程,是不用開(kāi)發(fā)人員干預(yù)的。所以一旦客戶端禁用Cookie,那么Session也會(huì)失效。

       2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙考慮到安全應(yīng)當(dāng)使用session。

       3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。

       4、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。(Session對(duì)象沒(méi)有對(duì)存儲(chǔ)的數(shù)據(jù)量的限制,其中可以保存更為復(fù)雜的數(shù)據(jù)類(lèi)型)

注意:

      session很容易失效,用戶體驗(yàn)很差;

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

      cookie也分為永久 和暫時(shí) 存在的;

      瀏覽器 有禁止cookie功能 ,但一般用戶都不會(huì)設(shè)置;

     一定要設(shè)置失效時(shí)間,要不然瀏覽器關(guān)閉就消失了;

 例如:

      記住密碼功能就是使用永久cookie寫(xiě)在客戶端電腦,下次登錄時(shí),自動(dòng)將cookie信息附加發(fā)送給服務(wù)端。

      application是全局性信息,是所有用戶共享的信息,如可以記錄有多少用戶現(xiàn)在登錄過(guò)本網(wǎng)站,并把該信息展示個(gè)所有用戶。

兩者最大的區(qū)別在于生存周期,一個(gè)是IE啟動(dòng)到IE關(guān)閉.(瀏覽器頁(yè)面一關(guān) ,session就消失了)
一個(gè)是預(yù)先設(shè)置的生存周期,或永久的保存于本地的文件。(cookie)

看完上述內(nèi)容,你們掌握session和cookie的原理是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI