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

PHP 變量生命週期與跨頁傳遞:從作用域規則到 Session、Token、JWT 現代方案

     編輯:PHP 相關知識

核心誤區:以為 POST 變量會自動傳遞到下一頁

大量初學者認為:form → page1.php → page2.php 中,page1.php 接收的 $start 會自動出現在 page2.php。錯誤! HTTP 無狀態,每次請求獨立,除非顯式傳遞(隱藏字段、URL 參數、Session、Cookie、Token),數據不會跨請求生存。

PHP 變量作用域與生命週期

類型生命週期作用域典型用途
超全局變量 ($_GET, $_POST, $_REQUEST)單次請求全局接收輸入
局部變量 (函數內)函數執行期間函數內部邏輯計算
全局變量 (global $x / $GLOBALS)單次請求全局 (需聲明)舊代碼兼容
靜態變量 (static $x)腳本運行期間 (進程級)函數內部緩存、計數器
Session 變量 ($_SESSION)會話存活期 (默認 24min GC)同用戶會話跨請求用戶狀態、權限、購物車
Cookie過期時間 (客戶端控制)同域跨請求、跨會話記住我、偏好設置、追蹤
APCu / Redis / Memcached配置 TTL / 手動清理進程/集群跨請求高性能緩存、分佈式鎖、限流
JWT (JSON Web Token)Token 過期時間 (自包含)無狀態、跨服務、跨域API 認證、單點登入、微服務

四大跨頁傳遞方案深度對比

1. URL 參數 (GET)

// page1.php
header("Location: page2.php?start=" . urlencode($start));
exit;

// page2.php
$start = $_GET['start'] ?? '';
  • 優點:簡單、可見、可收藏、無服務端狀態
  • 缺點:長度限制 (~2KB)、敏感數據暴露 URL/日誌/歷史、不可存複雜結構
  • 適用:非敏感標識 (分頁、排序、過濾、ID)

2. 隱藏表單字段 (POST)

  • 優點:不暴露 URL、支持較大數據、用戶可後退修改
  • 缺點:需每頁表單傳遞、用戶可篡改 (需簽名/加密)、刷新重複提交風險
  • 適用:多步驟表單向導、非敏感中間數據

3. Session (服務端存儲)

  • 優點:敏感數據不落地客戶端、支持複雜結構、易實現步驟跳轉/草稿保存
  • 缺點:需共享存儲 (Redis) 支持水平擴展、會話劫持風險 (需 HTTPS + HttpOnly + SameSite)、GC 清理可能丟失數據
  • 適用:用戶認證狀態、購物車、複雜向導、敏感中間數據

4. 客戶端 Token (JWT / 加密 Cookie)

// 簽發
$payload = [
    'sub' => $userId,
    'wizard' => ['start' => $start, 'step' => 1],
    'iat' => time(),
    'exp' => time() + 1800,
];
$token = JWT::encode($payload, $secretKey, 'HS256');
setcookie('wizard_token', $token, ['httponly' => true, 'secure' => true, 'samesite' => 'lax']);

// 驗證 (中間件)
$token = $_COOKIE['wizard_token'] ?? '';
try {
    $payload = JWT::decode($token, new Key($secretKey, 'HS256'));
    $start = $payload->wizard->start ?? '';
} catch (Exception $e) {
    // Token 過期/篡改/無效
}
  • 優點:無服務端狀態 (無 Session 存儲)、天然支持微服務/跨域、可攜帶完整上下文
  • 缺點:Token 體積大 (Cookie 4KB 限制)、撤銷困難 (需黑名單/短過期)、敏感數據雖加密但落地客戶端
  • 適用:無狀態 API、單點登入、跨域認證、服務間調用

綜合選型決策表

場景首選方案備選禁忌
用戶登錄狀態Session (Redis)JWT (API)Cookie 存密碼/權限
多步驟表單 (敏感)Session隱藏字段 + 簽名URL 參數
多步驟表單 (非敏感)隱藏字段Session-
分頁/排序/過濾URL 參數-Session
API 認證JWT / OAuth2 Access Token-Session Cookie
單點登入 (SSO)JWT / SAML / OIDC-Session
記住我 (長期)加密 Cookie (獨立 Token)-Session (生命週期短)
高性能緩存 (非用戶狀態)Redis / APCu-Session

安全加固鐵律

  1. HTTPS 全站強制:Session ID、Token、Cookie 僅在加密通道傳輸。
  2. Cookie 屬性:HttpOnly (防 XSS 竊取)、Secure (僅 HTTPS)、SameSite=Lax/Strict (防 CSRF)。
  3. Session 固定攻擊防範:登錄後 session_regenerate_id(true),session.use_strict_mode=1。
  4. 輸出編碼:HTML 上下文 htmlspecialchars(),JS json_encode(),URL urlencode(),SQL 參數化查詢。
  5. 最小權限原則:Session/Token 僅存必要數據,敏感字段 (密碼、身份證) 絕不存儲。

結語

PHP 變量默認「請求級」生命週期,跨頁傳遞本質是狀態管理。從 URL 參數、隱藏字段、Session 到 JWT,每種方案都是在安全性、擴展性、體驗、複雜度四維空間中的不同權衡。沒有萬能方案,只有場景最優解:敏感業務上 Session (Redis),無狀態 API 上 JWT,簡單導航用 URL 參數,表單向導用隱藏字段或 Session。理解本質,拒絕盲目複製貼上,才能構建安全可靠的 Web 應用。

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