同一主域名下,HTTP 與 HTTPS 頁面互相跳轉時,Session 失效。根因:session.cookie_secure 導致 HTTPS 下設的 Cookie 不發送給 HTTP,反之亦然;且跨協議屬於「跨域」,瀏覽器默認阻攔第三方 Cookie。
手動同步 Session ID:在跳轉鏈接中攜帶 session_id 參數,目標頁面讀取並 session_id($id) 後再 session_start(),強制使用同一 Session。
跳轉到 HTTPS 頁面'; ?>
| 風險 | 說明 | 緩解措施 |
|---|---|---|
| Session ID 暴露在 URL | Referer 洩露、瀏覽器歷史記錄、服務器日誌可見 | 1. 使用 POST 表單提交 2. 短時效一次性 Token 替換 Session ID 3. 跳轉後立即重新生成 ID session_regenerate_id(true) |
| Session 劫持 | 攻擊者竊取 ID 即可冒充用戶 | 1. 全站 HTTPS(HSTS) 2. session.cookie_secure=1 session.cookie_httponly=1 session.cookie_samesite=Strict3. 綁定 User-Agent/IP 指紋驗證 |
| CSRF | 跳轉鏈接可被構造 | 在 Session 中存儲 CSRF Token,關鍵操作驗證 |
若 HTTP/HTTPS 同屬一主域(如 example.com),推薦配置共享 Cookie:
; php.ini 或 runtime 設置 session.cookie_domain = ".example.com" ; 顯式設置根域(前綴點) session.cookie_secure = 0 ; 允許 HTTP 傳輸(若全站 HTTPS 改為 1) session.cookie_httponly = 1 ; 禁止 JS 訪問 session.cookie_samesite = "Lax" ; 平衡安全與體驗 session.use_strict_mode = 1 ; 拒絕未初始化的 ID session.sid_length = 32 ; 增加 ID 長度 session.sid_bits_per_character = 5 ; 更大熵空間
配合 session_set_save_handler() 使用 Redis/Memcached 集中存儲,多台服務器、多協議自動共享,無需手動傳遞 ID。
老高曾遇 Magento 站點 Cookie 失效數天,最終發現是 HTTP/HTTPS 混用導致 Cookie 域/安全屬性衝突。統一遷移至全站 HTTPS 並配置上述參數後問題徹底解決。