須要說明的是,PHP的session也是用cookie實現的,保存在瀏覽器的cookie名稱默認爲PHPSESSID.算法
這個session的cookie也是能夠設置過時時間的,好比過時時間設置爲3600秒:數據庫
session_set_cookie_params(3600);
這樣關閉瀏覽器後在一小時內從新打開這個cookie依舊有效.瀏覽器
PHP session是每個PHPSESSID默認對應一個保存會話數據的文件. 也就是說不一樣的PHPSESSID的會話數據是不共享的. 好比你用PHP session實現一個購物車或者視頻觀看記錄的功能, 你把購物車的數據保存在會話文件裏,那你在其餘設備或瀏覽器登陸後是看不到你的購物車數據的. 這時你應該把購物車數據保存在數據庫裏.安全
下面說說本身怎麼基於數據庫實現一套自定義的cookie會話機制:cookie
cookie裏存儲用戶ID(明文)和用戶的鹽值(哈希). 須要高安全性的話,還能夠用MCRYPT_BLOWFISH對整個cookie的內容作一次加密. 這個cookie既要作到能夠認證用戶,又要作到不能被僞造. 用戶的鹽值是在用戶註冊時,爲了保護密碼,而隨機生成並肯定下來,保存在用戶表裏對應用戶的一個字段數據.session
//保護用戶密碼的鹽 $salt = sha1( uniqid(getmypid().'_'.mt_rand().'_', true) ); //用戶的密碼($pwd_user是用戶輸入的密碼明文) $pwd_db = sha1($salt.sha1($pwd_user)); //cookie裏的鹽 //其中$global_salt是配置裏定義的全局鹽,用來保護用戶的鹽,一旦修改,全部用戶的cookie都將失效. $cookie_salt = sha1($global_salt.sha1($salt)); //最終生成的cookie內容 $cookie = base64_encode($user_id.'|'.$cookie_salt); //若是你須要高安全性,還可使用MCRYPT_BLOWFISH對整個cookie的內容作一次加密. $cookie = mcrypt_blowfish($cookie, $key); //設置cookie,這裏把過時時間設爲3600秒(1小時) setcookie($cookie_name, $cookie, time()+3600);
其中用戶的鹽,應用全局的鹽,以及MCRYPT_BLOWFISH加密的密鑰$key,都是隨機生成並肯定下來的. 算法好比:加密
sha1( uniqid(getmypid().'_'.mt_rand().'_', true) )
生成的是一個進程ID+隨機數+基於當前時間微秒數+熵的一個哈希值.code
驗證用戶的時候就是先用私鑰解密$_COOKIE['cookie_name'], 而後base64_decode拿到用戶ID, 而後根據用戶ID查詢用戶的鹽, 而後把這個鹽通過一樣的哈希算法後跟cookie裏的鹽$cookie_salt對比, 若是一致,則斷定用戶的cookie有效.視頻
//解密cookie $cookie = mdecrypt_blowfish($_COOKIE['cookie_name'], $key); //分割後拿到裏面的$user_id和$cookie_salt $cookie = explode('|', base64_decode($_COOKIE['cookie_name']));