myAdBanner

2026年5月12日 星期二

logout.php

 <?php
// 1. 初始化 Session
if (!isset($_SESSION)) {
    session_start();
}

// 2. 引入你的資料庫連線檔 (假設變數名稱為 $pdo)
// require_once('Connections/your_db_connection.php'); 

if ((isset($_GET['doLogout'])) && ($_GET['doLogout'] == "true")) {
    
    // --- [修正重點 A] 刪除資料庫中的 Remember Me Token ---
    if (!empty($_COOKIE['remember_me'])) {
        $parts = explode(':', $_COOKIE['remember_me']);
        if (count($parts) === 2) {
            $selector = $parts[0];
            // 執行刪除 (請根據你的資料庫結構調整)
            try {
                $stmt = $pdo->prepare("DELETE FROM user_tokens WHERE selector = ?");
                $stmt->execute([$selector]);
            } catch (Exception $e) {
                // 靜默失敗,不影響登出流程
            }
        }
    }

    // --- [修正重點 B] 清除 Session 變數 ---
    $_SESSION = array(); // 直接將 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(); // 銷毀 Session

    // --- [修正重點 C] 清除所有相關 Cookie ---
    $past = time() - 3600;
    
    // 清除舊有的欄位 (原本你存放在 Cookie 的敏感資料)
    setcookie('MM_Username', '', $past, '/');
    setcookie('MM_UserCname', '', $past, '/');
    setcookie('MM_UserGroup', '', $past, '/');
    setcookie('MM_UserGroupName', '', $past, '/');
    
    // 清除新的 Remember Me 安全 Token
    setcookie('remember_me', '', $past, '/', '', true, true);

    // 3. 導向首頁
    $logoutGoTo = "index.php";
    header("Location: $logoutGoTo");
    exit;
}
?>

主要修正說明:
  1. 資料庫連動刪除:安全機制的重點在於「Token 一次性」。當使用者主動點擊登出時,必須從資料庫 user_tokens 表中將該 selector 刪除,讓原本的 Cookie 徹底失效,防止他人盜用。
  2. 徹底銷毀 Session:原程式逐個 unset 較為繁瑣,使用 $_SESSION = array() 配合 session_destroy() 是目前更標準的寫法。
  3. 安全性 Cookie 設定
    • 在刪除 remember_me Cookie 時,建議帶上與當初發送時相同的參數(如 / 路徑)。
    • 提醒:既然你已經要實作安全的 remember_me 流程,建議不要再把 MM_Username(帳號)或 MM_UserGroup(權限)存進 Cookie 了,因為 Cookie 是可以被使用者隨意修改的,這會造成安全漏洞。