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

PHP Session 銷毀與清除的正確姿勢

     編輯:PHP 相關知識

PHP Session 銷毀與清除的正確姿勢

Session 是 Web 應用維持用戶狀態的核心機制。正確銷毀 Session 不僅要清理服務端數據,還需清除客戶端 Cookie,防止會話固定攻擊。

Session 生命週期速覽

  1. session_start() 初始化,首次訪問生成唯一 session_id,通過 Cookie(默認名 PHPSESSID)傳給客戶端。
  2. 後續請求瀏覽器自動攜帶 Cookie,PHP 恢復對應會話數據。
  3. 若客戶端禁用 Cookie,需透過 URL 傳遞 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 參數)。
  • Cookie 安全屬性:
    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;
}

遵循標準銷毀流程,配合安全配置,能有效保護用戶會話安全。

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