在某些特殊業務場景下(如單點登入、會話遷移、跨域共享會話),需要在運行時動態指定或修改 PHP 的 Session ID。本文展示如何通過 session_id() 函數實現會話 ID 的接管與切換。
<?php
// 從 GET 參數獲取目標 Session ID
if (isset($_GET["se"])) {
$se = $_GET["se"];
} else {
return; // 未提供 ID 則退出
}
if (!empty($se)) {
echo "receive se: " . $se . "<br><br>"; // 顯示接收到的 Session ID
// 關鍵步驟:必須在 session_start() 之前設置
session_id($se); // 將當前會話 ID 設為指定值
session_start(); // 啟動會話(注意順序不可顛倒)
echo "new session id: " . session_id() . "<br><br>";
echo $_SESSION['h']; // 讀取會話數據驗證
}
?>
session_id($id) 必須在 session_start() 之前調用,否則不生效<?php
// 更安全的封裝示例
function switchSession($newSessionId, $validateToken = null) {
// 1. 驗證 Token(防止會話劫持)
if ($validateToken && !validateToken($validateToken, $newSessionId)) {
throw new Exception("Invalid session switch token");
}
// 2. 關閉當前會話寫入
if (session_status() === PHP_SESSION_ACTIVE) {
session_write_close();
}
// 3. 設置新 ID 並啟動
session_id($newSessionId);
session_start();
// 4. 可選:重新生成 ID 防固定攻擊
// session_regenerate_id(true);
}
?>
掌握 Session ID 動態修改技術,能靈活應對複雜的會話管理需求,但務必將安全防護放在首位。