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

Cookie 與 Session 深度解析:機制、差異、安全與最佳實踐

     編輯:PHP 相關知識

Cookie 與 Session 深度解析:機制、差異、安全與最佳實踐

HTTP 無狀態,Cookie 與 Session 是維持會話的兩大基石。本文系統講解原理、API、配置、存儲介質、安全防範、跨域共享、銷毀策略。

Cookie:客戶端狀態

  • 本質:Server 通過 Set-Cookie 標頭寫入瀏覽器,瀏覽器後續請求自動攜帶 Cookie 標頭。
  • PHP 設置:setcookie('name', 'value', time()+86400, '/', 'example.com', false, true); 參數依次:名、值、過期時間戳、路徑、域名、僅 HTTPS、HttpOnly。
  • 讀取:$_COOKIE['name'](超全局)。
  • 刪除:setcookie('name', '', time()-3600) 或 setcookie('name', '')。
  • 限制:單 Cookie ≤ 4KB,單域名 ≤ 20-50 個,總大小 ≤ 4KB,用戶可禁用/清除。
  • 生效時機:設置後需下一請求才可讀取(標頭往返)。

Session:服務端狀態

  • 本質:Server 端存儲數據(文件/Redis/DB),只在 Cookie 中保存 PHPSESSID 作為索引鍵。
  • 啟動:session_start() 必須在輸出前調用。
  • 讀寫:$_SESSION['user'] = $data; $name = $_SESSION['user']['name'];。
  • 銷毀:session_unset() 清空變量,session_destroy() 刪除存儲文件/記錄。
  • 配置:
    • session.save_handler = files|redis|memcached
    • session.save_path = "/tmp" 或 "tcp://127.0.0.1:6379"
    • session.gc_maxlifetime = 1440(垃圾回收壽命)
    • session.cookie_httponly = 1、session.cookie_secure = 1(HTTPS)

核心差異

項目CookieSession
存儲位置客戶端瀏覽器服務端(文件/內存/DB)
容量~4KB受限於服務端記憶體/磁盤
安全性可被竄改、偷取(XSS/CSRF)數據不暴露,僅 ID 傳輸
生命週期可設定長期通常短期,瀏覽器關閉即失效(除非設定持久 Cookie)
跨域需 domain 設置需共享存儲 + 同域 Cookie

安全加固清單

  1. HttpOnly:防 XSS 竊取 Cookie/Session ID。
  2. Secure:僅 HTTPS 傳輸,防中間人竊聽。
  3. SameSite=Strict/Lax:防 CSRF(現代瀏覽器支援)。
  4. Session ID 重生成:登錄後 session_regenerate_id(true) 防固定攻擊。
  5. 敏感數據加密:Session 值若含敏感信息,應用層加密存儲。
  6. 分布式 Session:多機部署必須用 Redis/Memcached/DB 共享存儲,禁用本地文件。

常見問題排查

  • headers already sent:session_start()/setcookie() 前有輸出(空白、BOM、echo),用 ob_start() 緩衝。
  • Session 不生效:檢查 session.save_path 權限、磁盤滿、session.auto_start 衝突。
  • 跨子域共享:主域設置 session.cookie_domain = ".example.com",子域同樣 session_start()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved