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

PHP Session 完整實戰手冊:原理、配置、跨頁傳遞與安全防護

     編輯:PHP 相關知識

Session 解決 HTTP 無狀態痛點,在伺服器端保存用戶狀態,客戶端僅持有 `session_id`。本文系統梳理原理、API、跨頁難題與安全加固。

核心原理

  • 啟動:`session_start()` 檢查 Cookie 中 `PHPSESSID` → 有則讀取對應檔案反序列化填入 `$_SESSION` → 無則生成新 ID、建立檔案、下發 Cookie。
  • 儲存:腳本結束自動序列化 `$_SESSION` 寫回檔案(預設 `save_handler=files`)。
  • 垃圾回收:按 `gc_probability/gc_divisor` 機率掃描 `save_path` 刪除過期檔(`gc_maxlifetime`,預設 1440 秒)。

關鍵 API 速查 (PHP 5+ 標準寫法)

操作正確寫法廢棄/錯誤寫法
啟動`session_start()`無
註冊變數`$_SESSION['key'] = $val``session_register()`
讀取變數`$_SESSION['key']``$HTTP_SESSION_VARS['key']`
檢查存在`isset($_SESSION['key'])``session_is_registered()`
刪除單個`unset($_SESSION['key'])``session_unregister()`
銷毀所有`$_SESSION=[]; session_destroy();` + 刪 Cookie`session_unset()`
重新生成 ID`session_regenerate_id(true)` (參數 true 刪除舊檔)無
設定/取得名稱`session_name('NEWNAME')` / `session_name()`無

跨頁傳遞 `session_id` 三大路徑

  1. Cookie (預設):瀏覽器自動攜帶,最透明。
  2. URL 重寫:`php.ini` 設 `session.use_trans_sid=1` 且編譯 `--enable-trans-sid` (僅 Unix/Linux),PHP 自動在相對連結附加 `PHPSESSID=...`。
  3. 手動傳遞:隱藏表單 `` 或連結 `?PHPSESSID=...`,再在目標頁 `session_id($_GET['PHPSESSID']);` → `session_start()`。

常見失效原因:客戶端禁用 Cookie + 未開啟 `use_trans_sid` / Windows 不支援透明 SID + 相對路徑連結被緩存/重寫失效。

安全加固清單

  • ✅ `session.use_only_cookies = 1`:強制只用 Cookie 傳 ID,防 URL 洩露 Referer 攻擊。
  • ✅ `session.cookie_httponly = 1`:JS 無法讀取 Cookie,緩解 XSS 竊取。
  • ✅ `session.cookie_secure = 1`:僅 HTTPS 傳輸 Cookie (需全站 HTTPS)。
  • ✅ `session.use_strict_mode = 1`:拒絕未初始化的 ID,防 Session Fixation。
  • ✅ 關鍵操作前 `session_regenerate_id(true)`:登入、權限變更時換新 ID。
  • ✅ 自定義 `save_handler` 存 Redis/資料庫:叢集共享、防本地檔案洩露。
  • ✅ 敏感資料加密存入 Session:`openssl_encrypt()` / `defuse/php-encryption`。

手動銷毀 Session 標準流程

<?php
session_start();
$_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 全生命週期管理,構建安全可靠的用戶狀態體系。

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