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

PHP Cookie 完整操作指南:建立、讀取、刪除與無 Cookie 環境應對

     編輯:PHP 入門

PHP Cookie 完整操作指南

Cookie 是伺服器儲存在客戶端的小型文字資料,常用於識別用戶、記住偏好設定、追蹤行為等場景。PHP 提供直觀的函數操作 Cookie,本文涵蓋完整生命週期管理與實務技巧。

Cookie 基本概念

  • 儲存位置:客戶端瀏覽器
  • 傳輸方式:每次請求自動包含在 HTTP Header 中
  • 容量限制:單個 Cookie 約 4KB,單域名約 20-50 個
  • 安全性:不可儲存敏感資訊(密碼、Token 等),易遭竊取與篡改

建立 Cookie:setcookie()

必須在任何輸出之前呼叫(同 session_start())。

語法

setcookie(name, value, expire, path, domain, secure, httponly);
參數說明
nameCookie 名稱(陣列鍵名)
value儲存值,自動 URL 編碼
expire過期 Unix 時間戳,0 或省略為會話結束
path生效路徑,'/' 表示全域名
domain生效域名,'.example.com' 包含子域名
securetrue 僅 HTTPS 傳輸
httponlytrue 禁止 JavaScript 存取

範例 1:基本建立(1小時過期)

<?php
setcookie("user", "runoob", time() + 3600);
?>
<html>...</html>

範例 2:可讀性較佳的過期時間寫法

<?php
$expire = time() + 60 * 60 * 24 * 30; // 30天
setcookie("user", "runoob", $expire, "/", "", true, true);
//                    路徑  域名  HTTPS  HttpOnly
?>

提示:若不想自動 URL 編碼,可使用 setrawcookie()。

讀取 Cookie:$_COOKIE

PHP 自動解碼並填入超全域陣列 $_COOKIE。

<?php
// 讀取特定 Cookie
if (isset($_COOKIE["user"])) {
    echo "歡迎回來," . htmlspecialchars($_COOKIE["user"]) . "!";
} else {
    echo "你好,訪客!";
}

// 檢視所有 Cookie
print_r($_COOKIE);
?>

安全提醒:輸出 Cookie 值時務必使用 htmlspecialchars() 防止 XSS。

刪除 Cookie

將過期時間設為過去時間點即可:

<?php
// 刪除 user cookie
setcookie("user", "", time() - 3600, "/");
// 路徑必須與建立時一致才能生效
?>

無 Cookie 環境應對策略

部分用戶禁用 Cookie 或使用隱私模式,需備用方案:

方案一:表單隱藏欄位傳遞

<form action="process.php" method="post">
    <input type="hidden" name="session_id" value="<?php echo session_id(); ?>">
    <!-- 其他欄位 -->
</form>

方案二:URL 重寫傳遞 Session ID

啟用 session.use_trans_sid = 1(php.ini)或編譯時加入 --enable-trans-sid,PHP 會自動在連結中附加 Session ID。注意:有安全風險(URL 可能被分享、記錄在日誌中),謹慎使用。

方案三:LocalStorage / IndexedDB(前端儲存)

現代瀏覽器支援更大容量的客戶端儲存,配合 AJAX 傳送資料至伺服器,適合非敏感偏好設定。

進階應用:多層級 Cookie 管理

<?php
class CookieManager {
    private $defaultPath = '/';
    private $defaultDomain = '';
    private $secure = true;
    private $httponly = true;
    
    public function set($name, $value, $expire = 0, $path = null, $domain = null) {
        return setcookie(
            $name, $value,
            $expire ? time() + $expire : 0,
            $path ?? $this->defaultPath,
            $domain ?? $this->defaultDomain,
            $this->secure,
            $this->httponly
        );
    }
    
    public function get($name, $default = null) {
        return $_COOKIE[$name] ?? $default;
    }
    
    public function delete($name, $path = null, $domain = null) {
        return setcookie(
            $name, '',
            time() - 3600,
            $path ?? $this->defaultPath,
            $domain ?? $this->defaultDomain,
            $this->secure,
            $this->httponly
        );
    }
    
    // 批次設定:記住我功能
    public function rememberMe($userId, $token, $days = 30) {
        $this->set('remember_user', $userId, 86400 * $days);
        $this->set('remember_token', $token, 86400 * $days);
    }
    
    public function clearRememberMe() {
        $this->delete('remember_user');
        $this->delete('remember_token');
    }
}
?>

Cookie 與 Session 協作模式

  1. Session ID 存於 Cookie(預設):PHPSESSID Cookie 識別伺服器端 Session
  2. 記住我功能:長效 Cookie 儲存加密 Token,下次訪問自動登入並建立新 Session
  3. CSRF 保護:Cookie 儲存 CSRF Token,表單驗證時比對

安全檢查清單

  • [ ] 敏感資料不存入 Cookie
  • [ ] 重要 Cookie 設定 HttpOnly、Secure
  • [ ] 設定合理的 Path 與 Domain 限制範圍
  • [ ] 定期輪換加密金鑰(記住我 Token)
  • [ ] 遵循 GDPR/隱私法規,提供 Cookie 同意機制

Cookie 雖簡單,但關鍵在於「最小權限原則」:只在必要範圍、必要時間、必要安全層級下使用。配合 Session 機制,能構建流暢且安全的用戶體驗。

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