PHP cookie快取替代session

2021-08-05 20:29:07 字數 1570 閱讀 7515

使用者登入比使用者註冊複雜。由於http協議是一種無狀態協議,而伺服器要跟蹤使用者狀態,就只能通過cookie實現。大多數web框架提供了session功能來封裝儲存使用者狀態的cookie。

session的優點是簡單易用,可以直接從session中取出使用者登入資訊。

我們採用直接讀取cookie的方式來驗證使用者登入,每次使用者訪問任意url,都會對cookie進行驗證,這種方式的好處是保證伺服器處理任意的url都是無狀態的,可以擴充套件到多台伺服器。

由於登入成功後是由伺服器生成乙個cookie傳送給瀏覽器,所以,要保證這個cookie不會被客戶端偽造出來。

實現防偽造cookie的關鍵是通過乙個單向演算法(例如sha1),舉例如下:

當使用者輸入了正確的口令登入成功後,伺服器可以從資料庫取到使用者的id,並按照如下方式計算出乙個字串:

「使用者id」 + 「過期時間」 + sha1(「使用者id」 + 「使用者口令」 + 「過期時間」 + 「secretkey」)

當瀏覽器傳送cookie到伺服器端後,伺服器可以拿到的資訊包括:

使用者id

過期時間

sha1值

如果未到過期時間,伺服器就根據使用者id查詢使用者口令,並計算:

sha1(「使用者id」 + 「使用者口令」 + 「過期時間」 + 「secretkey」)

並與瀏覽器cookie中的md5進行比較,如果相等,則說明使用者已登入,否則,cookie就是偽造的。

這個演算法的關鍵在於sha1是一種單向演算法,即可以通過原始字串計算出sha1結果,但無法通過sha1結果反推出原始字串。

所以登入api可以實現如下:

public

function

login

(request $request)

// 加密

private

function

usercookie

($user,$max)

對於每個url處理函式,如果我們都去寫解析cookie的**,那會導致**重複很多次。

利用中介軟體在處理url之前,把cookie解析出來:

public

function

getinfo

()// 解密

private

function

cookieuser

($cookiestr)

list($id,$expiretime,$sha1) = $arr;

if($expiretime

< time())

$user = db::table('users')->where('id',$id)->find();

if(empty($user))

$str = $user['id'].'-'.$user['username'].'-'.$expiretime.'-'.self::cookie_key;

if($sha1 != sha1($str))

return

$user;

}

如何設定PHP cookie

1 如何設定php cookie setcookie a aa setcookie b bb 原意是想設定coolie但是報錯了.以下是錯誤資訊.warning cannot modify header information headers already sent by output start...

PHP Cookie建立,刪除

儲存在客戶端,使用者win的temp目錄中的 c users hzl16 64 位 兩者都可通過時間來設定時間長短 注釋 setcookie 函式必須位於 標籤之前。用於單一,所有頁面 語法 setcookie name,value,expire,path,domain 注釋 在傳送 cookie ...

PHP Cookie處理函式

o o bingo ok,我們先看看cookie是什麼東東?cookie是伺服器留在客戶端的用於識別使用者或者儲存一些資料的小檔案 注意,session儲存在伺服器端,這是兩者的區別之一 我們平時登入某門戶時,會有選項 是否儲存登入 或者 下次自動登入 當我們勾選了之後,伺服器就會在我們的瀏覽器建立...