萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP Cookie 實戰:用戶登入狀態加密儲存與自動登入實作

場景

用戶登入成功後,將加密後的用戶識別資訊寫入 Cookie,實現「記住我」或自動登入功能。

核心程式碼

function loginCookie($uid, $name, $group, $ip, $time) {
    global $site_domain, $login_key; // 須在配置文件定義

    // 統一 Cookie 域:去除 www. 前綴,加前導點支援子域
    $domain = (substr($site_domain, 0, 4) === "www.") 
        ? substr($site_domain, 3) 
        : "." . $site_domain;

    // 核心資料加密:UID|姓名|群組|IP,防竄改
    $secure = Xxtea::encrypt("{$uid}|{$name}|{$group}|{$ip}", $login_key);

    // 過期時間:當前時間 + 86400 秒(1 天)
    $expire = $time + 86400;

    setcookie("userId",   $uid,      $expire, "/", $domain);
    setcookie("userName", $name,     $expire, "/", $domain);
    setcookie("userGroup",$group,    $expire, "/", $domain);
    setcookie("userSecure",$secure,  $expire, "/", $domain);
}

關鍵點解析

  1. 域名處理:.example.com 允許所有子域讀取;去除 www. 避免 www.example.com 與 example.com 互不相容。
  2. 資料加密:使用 XXTEA 對稱加密(需引入庫),金鑰 $login_key 必須機密、定期輪換。防止用戶偽造 Cookie 提權。
  3. 綁定 IP:加密載荷包含登入時 IP,驗證時比對當前 IP,增加盜用難度(但移動網路 IP 常變,需權衡)。
  4. 路徑設為 /:全站有效。
  5. HttpOnly & Secure:生產環境建議加上 setcookie(..., true, true)(PHP 5.2+ 第 6/7 參數),防 XSS 竊取、強制 HTTPS 傳輸。

驗證端邏輯(配合參考)

function checkLoginCookie() {
    global $login_key;
    $uid      = $_COOKIE['userId'] ?? '';
    $name     = $_COOKIE['userName'] ?? '';
    $group    = $_COOKIE['userGroup'] ?? '';
    $ip       = $_SERVER['REMOTE_ADDR'];
    $secure   = $_COOKIE['userSecure'] ?? '';

    if (!$uid || !$secure) return false;

    $expected = Xxtea::encrypt("{$uid}|{$name}|{$group}|{$ip}", $login_key);
    // 使用 hash_equals 防時序攻擊
    return hash_equals($expected, $secure);
}

安全增強建議

  • 改用 JWT (JSON Web Token) 替代自定義加密,標準化、可攜帶過期時間、支援非對稱簽名。
  • Cookie 加上 SameSite=Lax 或 Strict 防禦 CSRF。
  • 敏感操作(修改密碼、綁定手機)需重新驗證密碼或雙因子認證。
copyright © 萬盛學電腦網 all rights reserved