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

PHP 會話控制深度解析:Cookie 與 Session 實戰全指南

     編輯:PHP 相關知識

為什麼需要會話控制?

HTTP 是無狀態協議,每次請求互不相關。為了識別用戶狀態(如登入狀態、購物車),引入了 Client 端 Cookie 與 Server 端 Session 兩大機制。

Cookie:客戶端儲存

核心操作

<?php
// 設定 Cookie(必須在輸出前)
setcookie('username', 'Lee', time() + 7*24*3600, '/', '', false, true); // 最後兩參數:secure, httponly

// 讀取
if (isset($_COOKIE['username'])) {
    echo '歡迎,' . htmlspecialchars($_COOKIE['username']);
}

// 刪除(設定過期時間為過去)
setcookie('username', '', time() - 3600, '/');
?>

Cookie 限制與注意事項

  • 大小 ≤ 4KB,數量 ≤ 30 個/域名,總計 ≤ 20 個/站點
  • 必須在 HTML 輸出之前設定
  • 瀏覽器可禁用/清除,不可信任機密資料
  • 跨子域共享:setcookie('name', 'val', ..., '.example.com')

Session:伺服器端儲存

基本流程

  1. session_start() 啟動/恢復會話(必須在輸出前)
  2. 資料存放於 $_SESSION 超全域陣列
  3. Session ID 透過 Cookie (預設 PHPSESSID) 或 URL 傳遞

核心操作範例

<?php
session_start();

// 寫入
$_SESSION['user'] = ['id' => 1, 'name' => 'Lee'];

// 讀取
if (isset($_SESSION['user'])) {
    echo '登入用戶:' . $_SESSION['user']['name'];
}

// 刪除單一鍵
unset($_SESSION['user']);

// 銷毀整個 Session
session_destroy(); // 同時需刪除 Cookie:setcookie(session_name(), '', time()-3600);
?>

Session 設定優化 (php.ini)

指令建議值說明
session.gc_maxlifetime1440垃圾回收最大壽命(秒)
session.cookie_httponly1防 JS 竊取 Session ID
session.cookie_secure1 (HTTPS)僅 HTTPS 傳輸 Cookie
session.use_strict_mode1拒絕未初始化的 Session ID
session.save_handlerfiles / redis分散式部署建議 Redis

安全防護清單

  • 關鍵操作重新驗證密碼(如修改郵箱、密碼)
  • 登入後重新生成 Session ID:session_regenerate_id(true) 防 Session Fixation
  • 設定 session.cookie_samesite = 'Lax' 或 'Strict' 緩解 CSRF
  • 敏感資料不要存入 Cookie,僅存 Session

總結

Cookie 適合「記住我」、追蹤偏好等非敏感長期資料;Session 適合登入狀態、權限、購物車等敏感短期資料。實務上常雙劍合璧:Session 存核心狀態,Cookie 存加密 Token 實現自動登入。

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