使用者登入比使用者註冊複雜。由於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儲存在伺服器端,這是兩者的區別之一 我們平時登入某門戶時,會有選項 是否儲存登入 或者 下次自動登入 當我們勾選了之後,伺服器就會在我們的瀏覽器建立...