Cookie 是 Web 開發中實現客戶端狀態保持的核心機制。本文系統梳理 PHP 中 Cookie 的創建、更新、讀取、刪除操作,並提供安全性與效能的最佳實踐建議。
setcookie(string $name, string $value = "", int $expire = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool
<?php
// 1. 基礎 Cookie(瀏覽器關閉即失效,即「會話 Cookie」)
setcookie('UserName', 'zs');
// 2. 指定過期時間:2 週後過期
$expire = time() + 2 * 7 * 24 * 3600; // 1209600 秒
setcookie('UserName', 'zs', $expire);
// 3. 完整參數:跨子域、HTTPS 強制、防 XSS
setcookie(
'UserName',
'zs',
$expire,
'/', // path: 整站可用
'.example.com', // domain: 支援所有子域
true, // secure: 僅 HTTPS 傳輸
true // httponly: 禁止 JS 讀取,防 XSS
);
關鍵點:
expire=0 或省略 → 會話 Cookie,瀏覽器關閉銷毀expire > time() → 持久化 Cookie,寫入硬碟expire < time() → 立即刪除 Cookie<?php
// 直接讀取(不存在時觸發 Notice)
$uName = $_COOKIE['UserName'];
// 安全讀取:先判斷是否存在
if (!empty($_COOKIE['UserName'])) {
$uName = $_COOKIE['UserName'];
} else {
$uName = '遊客';
}
// 現代寫法:null 合併運算符 (PHP 7+)
$uName = $_COOKIE['UserName'] ?? '遊客';
<?php
// 方法 1:設定過期時間為過去
setcookie('UserName', '', time() - 3600);
// 方法 2:值設為空字串,過期時間為過去
setcookie('UserName', null, time() - 3600);
// 方法 3:僅設定過期時間(值會被忽略)
setcookie('UserName', '', time() - 1);
// 刪除當前域名下所有 Cookie(慎用)
foreach ($_COOKIE as $key => $val) {
setcookie($key, '', time() - 3600, '/');
}
注意: 刪除時 path、domain、secure、httponly 必須與創建時一致,否則無法覆蓋原 Cookie。
Cookie 單值限制 4KB,但可存儲序列化數據:
<?php
// 寫入陣列數據
$userData = ['id' => 101, 'name' => '張三', 'role' => 'admin'];
setcookie('user_profile', json_encode($userData), time() + 86400, '/', '', true, true);
// 讀取並解析
$userProfile = json_decode($_COOKIE['user_profile'] ?? '{}', true);
echo $userProfile['name']; // 張三
| 策略 | 說明 | 實現方式 |
|---|---|---|
| HttpOnly | 防止 XSS 竊取 Cookie | setcookie 最後參數設 true |
| Secure | 僅 HTTPS 傳輸 | setcookie 第 6 參數設 true(生產環境必開) |
| SameSite | 防禦 CSRF 攻擊 | PHP 7.3+ 支援 setcookie(..., ['samesite' => 'Lax']) |
| 加密敏感值 | 避免明文存儲用戶 ID、權限等 | 使用 openssl_encrypt 或框架內置加密 |
| 最小化作用域 | 限制 path、domain 範圍 | 按業務需求設定最窄路徑 |
.example.com(前綴點)Cookie::make()、ThinkPHP cookie() 等自動處理安全參數Cookie 是無狀態 HTTP 的關鍵補充,掌握其完整生命週期管理,配合安全策略,能構建更可靠的用戶體驗。建議在項目中統一封裝 Cookie 操作類,集中管理安全參數與序列化邏輯。