本文提供配合前兩篇(session.inc.php3、cookie.inc.php3)的完整測試腳本,展示 Session 寫入、讀取與驗證的端到端流程。雖然程式碼屬歷史產物,但其邏輯結構清晰呈現了 Session 生命週期管理的核心步驟。
<?php require("session.inc.php3"); require("cookie.inc.php3"); ?>
<?php
session_checkid(20); // 20 分鐘後過期
mysql_connect('localhost','user','pass') or Die("can't connect to db!");
?>
session_checkid(20):檢查 Cookie 中是否有 sess_sid,無則產生新 ID 並透過 JavaScript 寫入 Cookie(有效期 20 分鐘)。$show 參數控制<?php
if ($show) {
if (session_read()) {
$username = $session[username];
$userpass = $session[userpass];
echo "<P>session[username]:$username session[userpass]:$userpass";
}
} else {
$session[username] = "yourid";
$session[userpass] = "12345";
if (!session_write()) { print $sess_error; }
else {
echo "<p>session[username]被設置成:$session[username]";
echo "<a href='$PATH_INFO?show=1'>測試一下SESSION的作用</a>";
}
}
?>
$show):建立測試資料寫入 $session 陣列,呼叫 session_write() 序列化存入資料庫,並顯示測試連結(帶 show=1)。show=1):呼叫 session_read() 從資料庫依 sess_sid 讀取並還原 $session 陣列,顯示內容驗證 Session 持久化成功。| 環節 | 原始實作 | 現代對應 |
|---|---|---|
| Session ID 產生 | uniqid('SC') |
PHP 內建 session_create_id()(PHP 7.1+)或自動管理 |
| Cookie 寫入 | JavaScript document.cookie |
setcookie() + session_set_cookie_params() |
| 資料序列化 | 自訂 Split_Array() + eval() |
serialize()/unserialize() 或 JSON |
| 資料儲存 | MySQL blob 欄位 |
Redis/Memcached/資料庫(透過 SessionHandlerInterface) |
| 過期清理 | 需自行排程 | PHP 原生 session.gc_* 設定 |
str2arr() 使用 eval() 解析資料庫內容,若資料庫被竄改將導致 RCE。$PATH_INFO?show=1,若未強制 HTTPS,Session ID 可能經由 Referer 洩漏。userpass=12345 明文寫入 Session,生產環境嚴禁。此範例完整示範了「Client Cookie → Server Session ID → Database Storage → Data Serialization → Retrieval」的閉環流程,是理解 Session 機制本質的優良教材。現代開發者只需實作 SessionHandlerInterface 即可替換儲存後端,核心流程邏輯保持一致。
實驗建議:若在現代 PHP(7.0+)環境測試此舊碼,需啟用register_globals(強烈不建議)或手動將$HTTP_GET_VARS/$HTTP_POST_VARS映射至全域變數,並修正mysql_*為mysqli_*或 PDO。純粹理解流程建議閱讀原始碼邏輯而非實際執行。