首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP+MySQL 身份驗證機制設計:摒棄 Cookie/Session 的替代方案

     編輯:PHP 綜合知識

校友錄專案需身份驗證,經評估 Cookie 易竄改、Session 易膨脹導致效能下降,決定採用「MD5 加密 ID + 資料庫記錄瀏覽狀態」的無狀態驗證方案。

核心邏輯

  1. 用戶登入後產生 user_id = MD5(隨機值),各頁面透過 URL 參數傳遞。
  2. 匿名訪客固定 ID:a684dd572b1887661782981659331eed (32 位)。
  3. 驗證函數 validate_id($link, $id, $ip, $page_name, $student_id) 返回 0/1。
  4. 判斷流程:
    • 若 ID 為匿名或空 → 記錄匿名瀏覽 → 返回 0。
    • 否則查詢 logging 表:同 ID、同 IP、最近 20 分鐘內有記錄 → 更新記錄 → 返回 1。
    • 查無記錄 → 視為離線 → 記錄匿名 → 返回 0。

資料表結構

CREATE TABLE logging (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id CHAR(32) NOT NULL,
    logging_ip VARCHAR(20) NOT NULL,
    page_name VARCHAR(30) NOT NULL,
    view_time TIMESTAMP NOT NULL,
    student_id VARCHAR(20)
);

驗證函數關鍵片段

function validate_id($link,$id,$ip,$page_name,$student_id="") {
    if($id=='a684dd572b1887661782981659331eed' || $id=='') {
        // 匿名記錄
        mysql_db_query("web", "INSERT INTO logging ... VALUES ('匿名ID','$ip','$page_name','anonym')", $link);
        return 0;
    }
    // 計算 20 分鐘前時間戳 (手動運算,避免資料庫函數相容性問題)
    $time_string = ...; // 年月日時分秒字串
    $query = "SELECT id FROM logging WHERE user_id='$id' AND logging_ip='$ip' AND view_time>'$time_string'";
    $result = mysql_db_query("web", $query, $link);
    if(mysql_num_rows($result)==0) {
        // 離線,記錄匿名
        return 0;
    } else {
        // 在線,更新記錄
        mysql_db_query("web", "INSERT INTO logging ... VALUES ('$id','$ip','$page_name')", $link);
        return 1;
    }
}

優缺點分析

  • 優點:無 Cookie 依賴、Session 不膨脹、資料庫可追蹤完整瀏覽軌跡。
  • 缺點:URL 暴露 ID、需手動計算時間、未處理重複登入。

此方案展示了無狀態驗證的另類思路,適合特定場景,生產環境建議結合 JWT 或 OAuth 2.0 等現代標準。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved