Session 是 Web 應用維持用戶狀態的核心機制。正確銷毀 Session 不僅要清理服務端數據,還需清除客戶端 Cookie,防止會話固定攻擊。
session_start() 初始化,首次訪問生成唯一 session_id,通過 Cookie(默認名 PHPSESSID)傳給客戶端。session_id(不推薦)。// 僅清空數組,不銷毀會話文件,不清除客戶端 Cookie unset($_SESSION); // 或 $_SESSION = [];
<?php
// 1. 啟動會話
session_start();
// 2. 清空當前會話數據
$_SESSION = [];
// 3. 刪除客戶端 Session Cookie
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(), // Cookie 名(默認 PHPSESSID)
'', // 空值
time() - 42000, // 過期時間設為過去
$params["path"], // 路徑
$params["domain"], // 域名
$params["secure"], // 是否僅 HTTPS
$params["httponly"] // HttpOnly
);
}
// 4. 徹底銷毀服務端會話文件
session_destroy();
?>
| 步驟 | 作用 | 備註 |
|---|---|---|
| session_start() | 初始化/恢復會話 | 必須在輸出前調用 |
| $_SESSION = [] | 清空超全局數組 | 不影響服務端存儲文件 |
| setcookie(...) | 刪除客戶端 Cookie | 參數需與 session_set_cookie_params() 一致 |
| session_destroy() | 刪除服務端會話文件 | 釋放存儲空間,防止會話劫持 |
session_regenerate_id(true) 重新生成 ID,舊會話文件自動刪除(true 參數)。ini_set('session.cookie_httponly', 1); 防 XSS 竊取ini_set('session.cookie_secure', 1); 僅 HTTPS 傳輸(生產環境必開)ini_set('session.use_strict_mode', 1); 拒絕未初始化的會話 ID
session.gc_probability、session.gc_divisor、session.gc_maxlifetime 定期清理過期文件。function logout(): void {
if (session_status() === PHP_SESSION_ACTIVE) {
$_SESSION = [];
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();
}
// 重定向至登錄頁或首頁
header('Location: /login.php');
exit;
}
遵循標準銷毀流程,配合安全配置,能有效保護用戶會話安全。