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

php.ini 中 Session 與 Cookie 相關配置參數深度解析

     編輯:PHP 相關知識

前言

Session 與 Cookie 是 Web 狀態管理的雙支柱,php.ini 提供精細控制參數。本文逐項解析 Session/Cookie 相關指令,並說明執行期動態調整函式。

一、Session 傳輸機制控制

1. session.use_cookies = 1

啟用 Cookie 作為 Session ID 傳輸載體。預設開啟,關閉則需靠 URL 重寫 (use_trans_sid) 或隱藏表單欄位傳遞,極不推薦。

2. session.name = PHPSESSID

Cookie 名稱 (或 URL 參數名)。建議自訂專屬名稱:

session.name = MYAPP_SESS

對應 Cookie 格式:MYAPP_SESS=abc123; Path=/; HttpOnly
URL 格式:/page.php?MYAPP_SESS=abc123

3. session.use_only_cookies = 1

關鍵安全參數。啟用後完全禁止 URL 重寫傳遞 Session ID,防止 Session Fixation 攻擊。
預設 PHP 5.3+ 為 1,舊版可能為 0,**生產環境必須設為 1**。

二、Cookie 屬性精細控制

php.ini 參數對應 setcookie() 參數說明建議值
session.cookie_lifetime$expireCookie 存活秒數,0 = 瀏覽器關閉失效 (Session Cookie)0
session.cookie_path$pathCookie 生效路徑,/ 為全站/
session.cookie_domain$domainCookie 生效域名,.example.com 含子域名.example.com
session.cookie_secure$secure僅 HTTPS 傳輸1 (僅 HTTPS 站點)
session.cookie_httponly$httponly禁止 JS 存取 (document.cookie)1
session.cookie_samesite$samesite跨站請求攜帶策略:Lax/Strict/NoneLax

動態修改:session_set_cookie_params()

<?php
// 必須在 session_start() 之前呼叫
session_set_cookie_params([
    'lifetime' => 3600,        // 1 小時
    'path' => '/',
    'domain' => '.example.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax'
]);
session_start();

// 獲取目前設定
var_dump(session_get_cookie_params());
/*
array(7) {
  ["lifetime"]=> int(3600)
  ["path"]=> string(1) "/"
  ["domain"]=> string(11) ".example.com"
  ["secure"]=> bool(true)
  ["httponly"]=> bool(true)
  ["samesite"]=> string(4) "Lax"
}
*/
?>

三、Session ID 讀寫控制函式

session_name([string $name])

<?php
// 獲取目前名稱
echo session_name(); // MYAPP_SESS

// 變更名稱 (必須在 session_start() 前)
session_name('NEW_SESS_NAME');
session_start();
?>

session_id([string $id])

<?php
// 獲取目前 ID
echo session_id(); // abc123def456

// 手動指定 ID (必須在 session_start() 前)
session_id('my_custom_id_123');
session_start();
// ⚠️ 自訂 ID 需符合 sid_length/bits_per_character 規則,否則會被重新產生
?>

四、Session 模組啟動與序列化

參數預設說明
session.auto_start0自動啟動 Session (不推薦,影響效能與彈性)
session.serialize_handlerphp序列化引擎:php, php_binary, igbinary (需擴充)

五、垃圾回收 (GC) 機制參數

session.gc_probability = 1
session.gc_divisor = 1000
; 機率 = 1/1000 = 0.1% 每請求觸發一次掃描

session.gc_maxlifetime = 1440
; 超過 1440 秒 (24分) 未存取的 Session 檔案視為垃圾刪除

⚠️ 多應用共用 save_path 但 gc_maxlifetime 不同時,**以最小值為準** 刪除,導致長壽命應用 Session 被誤刪。**解決:隔離 save_path**。

六、進階/較少用參數

參數預設說明
session.referer_check空驗證 HTTP Referer 含指定字串,不符則拒絕 Session ID (弱防禦)
session.entropy_length0從 entropy_file 讀取位元組數作為 ID 熵來源 (PHP 7.1+ 棄用,改用隨機源)
session.entropy_file空熵來源檔案,如 /dev/urandom (PHP 7.1+ 棄用)
session.cache_limiternocachenocache/private/public,控制 Session 頁面 HTTP 快取行為
session.cache_expire180快取過期分鐘數
session.use_trans_sid0透明 Session ID (URL 重寫),安全風險高,建議 0
url_rewriter.tagsa=href,area=href,frame=src,input=src,form=fakeentry透明 SID 重寫的 HTML 標籤屬性

七、完整對照表 (php.ini 節選)

[Session]
session.save_handler = files
session.save_path = "/var/lib/php/session"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain = 
session.cookie_secure = 0
session.cookie_httponly = 1
session.cookie_samesite = Lax
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check = 
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

八、最佳實踐總結

  1. 安全三件套:use_only_cookies=1 + cookie_httponly=1 + cookie_secure=1 (HTTPS) + cookie_samesite=Lax
  2. 自訂名稱:session.name = APP_SESS 隱藏技術棧
  3. 隔離儲存:每應用獨立 save_path,避免 GC 衝突
  4. 動態調整:跨子域、多租戶場景用 session_set_cookie_params() 程式化控制
  5. 定期稽核:檢查 session.gc_* 參數與實際 Session 檔案數量是否匹配

精通這些參數,能讓你在單點登入 (SSO)、跨域共享 Session、微服務架構下的狀態管理等複雜場景中遊刃有餘。

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