重要的是要了解 session.cookie_lifetime=0 會在瀏覽器關閉時刪除 cookie,但現在的瀏覽器即使在最後一個視窗或分頁關閉後也往往不會真正關閉。
為了啟動速度和接收推播訊息,瀏覽器會縮小到背景,因此 cookie 會保留下來。
透過保護與 Session 相關的 INI 設定,開發人員可以提升 Session 的安全性。某些重要的 INI 設定沒有任何建議值。開發人員有責任強化 Session 設定。
0
具有特殊含義。它告知瀏覽器不要將 Cookie 儲存到永久儲存空間。因此,當瀏覽器關閉時,Session ID Cookie 會立即被刪除。如果開發人員將此設定為非 0 值,則可能允許其他使用者使用該 Session ID。大多數應用程式應該將此設定為 "0
"。
如果需要自動登入功能,開發人員必須自行實作安全的自動登入功能。不要使用長效 Session ID 來實現此功能。更多資訊可以在上面相關章節中找到。
儘管 HTTP Cookie 存在一些問題,但 Cookie 仍然是管理 Session ID 的首選方式。在可能的情況下,僅使用 Cookie 來管理 Session ID。大多數應用程式應該使用 Cookie 作為 Session ID。
如果 session.use_only_cookies=Off,在 session ID cookie 未初始化的情況下,session 模組會使用 GET 或 POST 設定的 session ID 值。
雖然啟用 session.use_strict_mode 對於安全的 session 來說是必要的,但預設情況下它是停用的。
這可以防止 session 模組使用未初始化的 session ID。換句話說,session 模組只接受由 session 模組產生的有效 session ID,並拒絕任何使用者提供的 session ID。
由於 cookie 的規範,攻擊者能夠透過在本地設定 cookie 資料庫或注入 JavaScript 來放置無法移除的 session ID cookie。session.use_strict_mode 可以防止使用攻擊者初始化的 session ID。
注意:
攻擊者可能會使用他們的裝置初始化 session ID,並設定受害者的 session ID。他們必須保持 session ID 處於活動狀態才能進行濫用。在這種情況下,攻擊者需要額外的步驟才能執行攻擊。因此,session.use_strict_mode 可作為一種緩解措施。
拒絕 JavaScript 存取 session cookie。此設定可防止 cookie 被 JavaScript 注入竊取。
可以將 session ID 用作 CSRF 令牌,但不建議這樣做。例如,HTML 原始碼可能會被儲存並傳送給其他使用者。為了更好的安全性,開發人員不應在網頁中寫入 session ID。幾乎所有應用程式都必須為 session ID cookie 使用 httponly 屬性。
注意:
CSRF 令牌應像 session ID 一樣定期更新。
僅允許在協議為 HTTPS 時存取 session ID cookie。如果網站只能透過 HTTPS 存取,則應啟用此設定。
對於只能透過 HTTPS 存取的網站,應考慮使用 HSTS。
session.cookie_samesite="Lax" 或 session.cookie_samesite="Strict"
從 PHP 7.3 開始,可以為 session ID cookie 設定 "SameSite"
屬性。此屬性是一種降低 CSRF(跨站請求偽造)攻擊風險的方法。
Lax 和 Strict 之間的區別在於,使用 HTTP GET 方法從另一個可註冊網域發出的請求是否可以存取 cookie。使用 Lax 的 cookie 在來自另一個可註冊網域的 GET 請求中可以存取,而使用 Strict 的 cookie 則不行。
session.gc_maxlifetime=[選擇盡可能小的值]
session.gc_maxlifetime 是一個用於刪除過期 session ID 的設定。*不建議*依賴此設定。開發人員應自行使用時間戳記管理 session 的生命週期。
最佳的 Session GC(垃圾回收)執行方式是使用 session_gc() 函式。 session_gc() 函式應由任務管理器執行,例如類 UNIX 系統上的 cron。
預設情況下,GC(垃圾回收)是依據機率執行的。此設定並不保證過期工作階段會被刪除。雖然開發者不能依賴此設定,但建議將其指定為最小可能值。調整 session.gc_probability 和 session.gc_divisor,以便以適當的頻率刪除過時的工作階段。如果需要自動登入功能,開發者必須自行實作安全的自動登入功能,詳情請見上文。切勿使用長效的工作階段 ID 來實作此功能。
注意:
某些工作階段儲存處理模組不會使用此設定進行基於機率的到期處理。例如 memcached、memcache。詳情請參閱工作階段儲存處理模組的說明文件。
不禁止使用透明工作階段 ID 管理。開發者可以在需要時使用它。但是,停用透明工作階段 ID 管理可以藉由消除工作階段 ID 注入和/或洩漏的可能性來提高整體工作階段 ID 的安全性。
注意:
工作階段 ID 可能會從加入書籤的網址、透過電子郵件傳送的網址、儲存的 HTML 原始碼等洩漏。
session.trans_sid_tags=[限定標籤]
(PHP 7.1.0 以上) 開發者不應重寫不需要的 HTML 標籤。預設值應足以應付大多數用途。較舊的 PHP 版本使用 url_rewriter.tags 來代替。
session.trans_sid_hosts=[限定主機]
(PHP 7.1.0 以上) 此 INI 設定定義允許透明工作階段 ID 重寫的白名單主機。切勿新增不受信任的主機。當此設定為空時,工作階段模組僅允許 $_SERVER['HTTP_HOST']
。
session.referer_check=[來源網址]
當 session.use_trans_sid 啟用時,它可以降低工作階段 ID 注入的風險。如果網站是 http://example.com/
,請將其設定為 http://example.com/
。請注意,使用 HTTPS 時,瀏覽器不會傳送 Referer 標頭。瀏覽器也可能因設定而未傳送 Referer 標頭。因此,此設定並非可靠的安全措施。建議使用此設定。
session.cache_limiter=nocache
確保已驗證工作階段的 HTTP 內容不被快取。僅允許在內容非私密時進行快取。否則,內容可能會外洩。"private"
可用於 HTTP 內容不包含安全敏感資料的情況。請注意,"private"
可能會傳輸由共用用戶端快取的私密資料。"public"
只能用於 HTTP 內容完全不包含任何私密資料的情況。
session.hash_function="sha256"
(PHP 7.1.0 以下) 更強的雜湊函式會產生更強的工作階段 ID。雖然即使使用 MD5 雜湊演算法,雜湊碰撞的可能性也不大,但開發者應使用 SHA-2 或更強的雜湊演算法,例如 sha384 和 sha512。開發者必須確保為使用的雜湊函式提供足夠長的 熵值。
session.save_path=[不可全域讀取的目錄]
如果將此設定為可全域讀取的目錄,例如 /tmp(預設值),伺服器上的其他使用者可能會透過取得該目錄中的檔案清單來劫持工作階段。
重要的是要了解 session.cookie_lifetime=0 會在瀏覽器關閉時刪除 cookie,但現在的瀏覽器即使在最後一個視窗或分頁關閉後也往往不會真正關閉。
為了啟動速度和接收推播訊息,瀏覽器會縮小到背景,因此 cookie 會保留下來。