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

PHP Cookie 完整應用:設定、刪除、登入驗證與安全實務

     編輯:PHP 相關知識

Cookie 基本機制

Cookie 由伺服器透過 HTTP 標頭 Set-Cookie 送至瀏覽器,瀏覽器後續請求會自動攜帶。PHP 自動將 Cookie 解析至 $_COOKIE 超全域陣列。

setcookie() 參數詳解

setcookie(
    string $name,
    string $value = '',
    int $expire = 0,
    string $path = '',
    string $domain = '',
    bool $secure = false,
    bool $httponly = false
)
  • expire:Unix 時間戳,time()+3600 代表 1 小時後過期;0 為瀏覽器關閉失效。
  • path:/ 表示全站有效;預設為當前腳本目錄。
  • domain:.example.com 含所有子域名;www.example.com 僅限該主機。
  • secure:僅 HTTPS 傳送。
  • httponly:JavaScript 無法存取(防 XSS)。

常見操作範例

設定 Cookie

<?php
// 簡單設定
setcookie('lang', 'zh-TW', time() + 86400, '/'); // 1 天

// 完整參數(跨子域名、HTTPS、HttpOnly)
setcookie('auth_token', $token, time() + 3600, '/', '.example.com', true, true);
?>

讀取 Cookie

<?php
// 單一值
$user = $_COOKIE['user'] ?? 'Guest';

// 檢查是否存在
if (isset($_COOKIE['remember_me'])) {
    // 自動登入邏輯
}

// 除錯:查看所有 Cookie
print_r($_COOKIE);

刪除 Cookie

// 必須與設定時相同的 path、domain、secure、httponly
setcookie('auth_token', '', time() - 3600, '/', '.example.com', true, true);

進階:登入狀態管理範例

function setLoginCookie($userId, $username, $role, $ip, $expire = 86400) {
    $domain = '.example.com'; // 依實際域名調整
    $secure = true;           // 僅 HTTPS
    $httponly = true;         // 防 XSS

    // 加密敏感資料(示意,實務請用 openssl 或 sodium)
    $payload = "$userId|$username|$role|$ip";
    $encrypted = base64_encode(openssl_encrypt($payload, 'AES-256-CBC', ENCRYPT_KEY, 0, IV));

    setcookie('uid', $userId, time() + $expire, '/', $domain, $secure, $httponly);
    setcookie('uname', $username, time() + $expire, '/', $domain, $secure, $httponly);
    setcookie('urole', $role, time() + $expire, '/', $domain, $secure, $httponly);
    setcookie('usec', $encrypted, time() + $expire, '/', $domain, $secure, $httponly);
}

function validateLoginCookie() {
    if (!isset($_COOKIE['uid'], $_COOKIE['usec'])) return false;

    $decrypted = openssl_decrypt(base64_decode($_COOKIE['usec']), 'AES-256-CBC', ENCRYPT_KEY, 0, IV);
    [$uid, $uname, $role, $ip] = explode('|', $decrypted);

    // 驗證 IP、角色等
    if ($ip !== $_SERVER['REMOTE_ADDR']) return false;

    return ['uid' => $uid, 'username' => $uname, 'role' => $role];
}

安全性最佳實務

  1. 啟用 HttpOnly:防止 XSS 竊取 Cookie。
  2. 啟用 Secure:僅 HTTPS 傳輸,防止中間人攻擊。
  3. 設定 SameSite(PHP 7.3+):setcookie(..., ['samesite' => 'Lax']) 防禦 CSRF。
  4. 敏感資料加密:Cookie 值加密儲存,避免洩露用戶 ID、角色等。
  5. 定期輪換 Token:登入 Token 設定較短過期時間,配合 Refresh Token 機制。
  6. 避免儲存大量資料:Cookie 單個 4KB 限制,大量資料改用 Session 或資料庫。

常見坑點

  • 設定後立即讀不到:$_COOKIE 只包含請求時瀏覽器送來的 Cookie,剛 setcookie() 設定的需下一次請求才會出現。解決:同步寫入 $_COOKIE[$name] = $value(如本文前文 set_cookie_live 函數)。
  • 路徑/域名不匹配導致無法刪除:刪除時參數必須與設定時完全一致。
  • 中文值需編碼:setcookie 會自動 URL 編碼,讀取時自動解碼,但建議自行 urlencode/urldecode 確保一致性。

結語

Cookie 是無狀態 HTTP 的關鍵狀態載體,正確設定屬性、加密敏感資料、配合 SameSite/HttpOnly/Secure 三大旗標,能構建安全可靠的用戶識別機制。

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