PHP cookie和session機制

來源:互聯網
上載者:User
各位大神我對cookie和session機制一直都搞的不是特別清楚,有沒有好的資料讓我學習學習,感激不盡

回複內容:

各位大神我對cookie和session機制一直都搞的不是特別清楚,有沒有好的資料讓我學習學習,感激不盡

其實你帶著問題去搜尋引擎找, 會得出很多答案的.
cookie和session解決了什麼問題? 怎麼解決這個問題的? 其實搞清楚了這兩個問題, 它的運行機制你自然就會明白.

  1. cookie和session解決了什麼問題?

彌補了http協議的天生缺陷, 無狀態的(無法辯認上個請求和下個請求是否來自同一個使用者).

  1. 怎麼解決的?

在伺服器端儲存一個key=>value的值, 並把這個key通過cookie進行傳送. 每次用戶端請求的時候, 把這個key帶到伺服器端, 伺服器就能區分請求是否來自同一使用者.

上面只是簡單地回答了cookie和session的機制. 具體的答案可以帶著這兩個問題去搜尋.

在你瞭解他們的實現原理之前,先區分好2者的角色。

Cookie——存在於瀏覽器之中的一種快取資料,可以被瀏覽器關閉(在設定裡)。如果瀏覽器關閉了Cookie,Cookie將不可用。現在一般沒人關Cookie了。
既然Cookie是來源於瀏覽器,實質上任何人都可以動你的Cookie。安全嗎?當然不安全。那這個時候如何做到安全?請使用Session,而且沒有例外。

Session——顧名思義“會話”,它儲存在伺服器上,這有別於Cookie是儲存在使用者的瀏覽器裡。而它是基於Cookie的。如果Cookie無效,Session也會無法正常使用。因為Session會將自己的Session_id放在Cookie中。每次與網站伺服器通訊時,伺服器端的程式語言都可以擷取Cookie中的這個session_id,從而讀取伺服器上儲存的session資料。
session_id是非常重要的東西。如果Cookie關閉後還希望Sesion有用怎麼辦?每一個請求都在header裡帶一個kv,裡面提供了session_id。。。BLABLABLA。。。我認為你現在還不需要學習這個,這隻是題外話。

COOKIE——資料存放區在使用者當前所使用的瀏覽器(換一個瀏覽器,之前的COOKIE又沒有了噢),安全性弱

SESSION——資料存放區在伺服器,安全性強。換個瀏覽器,也會需要你重新登入。因為它依託的cookie也因為瀏覽器的緣故不同了。

接下來,怎麼用Cookie和Session?你可以學習下。

session可以基於cookie實現,也可以基於get參數實現,雖然不安全.
看看下面用MySQL記憶體表實現會話儲存的例子就大概知道session和cookie的關係了.

CREATE TABLE sessions (    user_id int(10) unsigned NOT NULL,    session text NOT NULL,    md5 char(32) NOT NULL,    PRIMARY KEY (user_id)) ENGINE=MEMORY DEFAULT CHARSET=utf8;其中:user_id儲存的是使用者ID,作為主鍵.session儲存的是使用者的會話數組經過serialize或json_encode後的字串.md5儲存的是session欄位的MD5值,用於實現Check And Set版本號碼樂觀鎖:--讀取會話SELECT session, md5 --寫入會話時需要用到這裡查出來的md5,就是下面的$last_md5FROM sessions WHERE user_id = $user_id--寫入會話UPDATE sessionsSET session = $str, md5 = md5($str)WHERE user_id = $user_id AND md5 = $last_md5 --檢查MD5,確保session欄位沒有被修改過

基於資料庫實現一套自訂的cookie會話機制.
這個cookie既要做到認證使用者,又要做到不能被偽造和破解.

//保護使用者密碼的鹽$salt = sha1(uniqid($user_id.'_'.getmypid().'_'.mt_rand().'_', true));//資料庫儲存的使用者密碼($pwd_user是使用者輸入的密碼明文)//可以先在瀏覽器端使用CryptoJS.MD5()雜湊密碼後傳給伺服器處理,//保證伺服器對使用者密碼明文的不知情,最好使用https加密傳輸避免被竊聽和修改.//資料庫儲存的使用者密碼($pwd_user是使用者輸入的密碼明文)$pwd_db = sha1($salt.sha1($pwd_user));//password_hash傳回值包含鹽,這時不需要外部$salt參與.//password_verify可實現耗時恒定的字串比較避免時序攻擊.//$pwd_db = password_hash($pwd_user, PASSWORD_DEFAULT);//cookie裡的鹽//其中$global_salt是配置裡定義的全域鹽,用來保護使用者的鹽,一旦修改,所有使用者的cookie都將失效.$cookie_salt = sha1($global_salt.sha1($salt));//最終產生的cookie內容$cookie = base64_encode($user_id.'|'.$cookie_salt);//如果你需要高安全性,還可以使用AES(MCRYPT_RIJNDAEL_256)對整個cookie的內容做一次加密.//$cookie = mcrypt_aes($cookie, $key);//設定cookie,這裡把到期時間設為604800秒(60*60*24*7,一周)setcookie('sessid', $cookie, time()+604800, '/', '', false, true);//解密cookie//$cookie = mdecrypt_aes($_COOKIE['sessid'], $key);//解碼分割後拿到裡面的$user_id和$cookie_salt//根據$user_id查詢$salt拼出$cookie_salt,然後跟cookie裡的$cookie_salt做對比,一致則通過cookie認證.$cookie = explode('|', base64_decode($_COOKIE['sessid']));list($user_id, $cookie_salt) = $cookie;
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.