Cookie 與 Session 是 Web 狀態管理的雙支柱。本文系統梳理 PHP 中兩者的工作原理、API 用法、安全考量與常見坑點。
setcookie() 函數(必須在任何輸出前調用):
bool setcookie(
string $name,
string $value = "",
int $expire = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false
)
參數詳解:
name:Cookie 名稱value:值(自動 URL 編碼)expire:過期 Unix 時間戳,0=會話結束,負值=刪除path:生效路徑,/ 為全站domain:生效域名,.example.com 含子域名secure:僅 HTTPS 傳輸httponly:禁止 JS 訪問(防 XSS)<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value); // 會話級
setcookie("TestCookie", $value, time()+3600); // 1小時
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); // 完整參數
?>
setcookie('user[name]', 'John');
setcookie('user[email]', 'john@example.com');
// 讀取:$_COOKIE['user']['name']
header("Set-Cookie: name=$value; path=/; domain=.example.com; secure; HttpOnly");
echo $_COOKIE['TestCookie']; // 自動解碼
print_r($_COOKIE); // 查看所有
setcookie("name", "", time() - 3600); // 過期時間設為過去
// 或
setcookie("name", "", 1); // 過期時間設為 1 (1970-01-01)
PHPSESSID)或 URL 傳遞$_SESSION<?php
session_start(); // 必須最先調用,且無輸出前
// 存儲
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'john';
$_SESSION['permissions'] = ['read', 'write'];
// 讀取
echo $_SESSION['username'];
// 刪除單個
unset($_SESSION['username']);
// 銷毀整個 Session
session_destroy(); // 刪除服務端文件
session_unset(); // 清空 $_SESSION 變量
// 通常配合使用:
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();
?>
| 指令 | 推薦值 | 說明 |
|---|---|---|
| session.save_handler | files / redis | 存儲引擎 |
| session.save_path | /var/lib/php/session | 文件存儲路徑 |
| session.gc_maxlifetime | 1440 (24分) | 垃圾回收壽命(秒) |
| session.cookie_lifetime | 0 | 0=瀏覽器關閉失效 |
| session.cookie_httponly | 1 | 防 XSS 必開 |
| session.use_strict_mode | 1 | 防 Session 固定攻擊 |
| session.cookie_secure | 1 (HTTPS) | 僅 HTTPS 傳輸 |
| 維度 | Cookie | Session |
|---|---|---|
| 存儲位置 | 客戶端 | 服務端 |
| 容量限制 | ~4KB | 無實際限制 |
| 安全性 | 可被竄改/偷取 | 相對安全 |
| 生命周期 | 可長期持久化 | 通常短期 |
| 適用場景 | 記住我、偏好設置、追蹤 | 登錄態、購物車、敏感數據 |
session_regenerate_id(true) 防固定攻擊session.cookie_secure=1、Cookie secure 標志session.cookie_httponly=1、Cookie httponly 標志session.cookie_samesite = 'Lax' 或 'Strict' 防 CSRF理解 Cookie/Session 本質,配合安全配置,是構建健壯 Web 應用的基石。