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

PHP Cookie 與 Session 深度解析:機制、操作與最佳實踐

     編輯:PHP 綜合知識

Cookie 與 Session 是 Web 狀態管理的雙支柱。本文系統梳理 PHP 中兩者的工作原理、API 用法、安全考量與常見坑點。

一、Cookie 詳解

1.1 設置 Cookie

setcookie() 函數(必須在任何輸出前調用):

bool setcookie(
    string $name,
    string $value = "",
    int $expire = 0,
    string $path = "",
    string $domain = "",
    bool $secure = false,
    bool $httponly = false
)

參數詳解:

  • name:Cookie 名稱
  • value:值(自動 URL 編碼)
  • expire:過期 Unix 時間戳,0=會話結束,負值=刪除
  • path:生效路徑,/ 為全站
  • domain:生效域名,.example.com 含子域名
  • secure:僅 HTTPS 傳輸
  • httponly:禁止 JS 訪問(防 XSS)

示例

<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);                           // 會話級
setcookie("TestCookie", $value, time()+3600);              // 1小時
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); // 完整參數
?>

數組形式 Cookie

setcookie('user[name]', 'John');
setcookie('user[email]', 'john@example.com');
// 讀取:$_COOKIE['user']['name']

1.2 直接發送 Header 設置(底層方式)

header("Set-Cookie: name=$value; path=/; domain=.example.com; secure; HttpOnly");

1.3 讀取 Cookie

echo $_COOKIE['TestCookie']; // 自動解碼
print_r($_COOKIE); // 查看所有

1.4 刪除 Cookie

setcookie("name", "", time() - 3600); // 過期時間設為過去
// 或
setcookie("name", "", 1); // 過期時間設為 1 (1970-01-01)

二、Session 詳解

2.1 工作原理

  1. 用戶首次訪問 → 生成唯一 Session ID
  2. Session ID 通過 Cookie(默認 PHPSESSID)或 URL 傳遞
  3. 服務端存儲數據(文件/內存/Redis/DB),以 Session ID 為鍵
  4. 後續請求攜帶 Session ID → 服務端恢復數據到 $_SESSION

2.2 基本操作

<?php
session_start(); // 必須最先調用,且無輸出前

// 存儲
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'john';
$_SESSION['permissions'] = ['read', 'write'];

// 讀取
echo $_SESSION['username'];

// 刪除單個
unset($_SESSION['username']);

// 銷毀整個 Session
session_destroy(); // 刪除服務端文件
session_unset();   // 清空 $_SESSION 變量
// 通常配合使用:
$_SESSION = array();
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();
?>

2.3 關鍵配置 (php.ini)

指令推薦值說明
session.save_handlerfiles / redis存儲引擎
session.save_path/var/lib/php/session文件存儲路徑
session.gc_maxlifetime1440 (24分)垃圾回收壽命(秒)
session.cookie_lifetime00=瀏覽器關閉失效
session.cookie_httponly1防 XSS 必開
session.use_strict_mode1防 Session 固定攻擊
session.cookie_secure1 (HTTPS)僅 HTTPS 傳輸

三、Cookie vs Session 選型指南

維度CookieSession
存儲位置客戶端服務端
容量限制~4KB無實際限制
安全性可被竄改/偷取相對安全
生命周期可長期持久化通常短期
適用場景記住我、偏好設置、追蹤登錄態、購物車、敏感數據

四、安全最佳實踐

  1. Session ID 重生成:登錄成功後調用 session_regenerate_id(true) 防固定攻擊
  2. HTTPS 全站:設置 session.cookie_secure=1、Cookie secure 標志
  3. HttpOnly:session.cookie_httponly=1、Cookie httponly 標志
  4. SameSite:PHP 7.3+ session.cookie_samesite = 'Lax' 或 'Strict' 防 CSRF
  5. 敏感數據不入 Cookie:權限、余額、ID 等只存 Session
  6. 分布式系統:使用 Redis/Memcached 做 Session 共享存儲

理解 Cookie/Session 本質,配合安全配置,是構建健壯 Web 應用的基石。

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