通過(guò)使用 INI 文件中和會(huì )話(huà)安全相關(guān)的配置項,來(lái)提高會(huì )話(huà)的安全性。 有一些重要的配置項沒(méi)有默認值, 所以你需要自行設置。
0
表示特殊含義,它告知瀏覽器不要持久化存儲 cookie 數據。
也即,關(guān)閉瀏覽器的時(shí)候,會(huì )話(huà) ID cookie 會(huì )被立即刪除。
如果將此項設置為非 0 的值,
可能會(huì )導致會(huì )話(huà) ID 被其他用戶(hù)使用。
大部分應用應該把此項設置為 "0
"。
如果應用中有自動(dòng)登錄的功能, 請自行實(shí)現一種更加安全的方式, 而不要使用長(cháng)生命周期的會(huì )話(huà) ID 來(lái)完成自動(dòng)登錄。 至于如何實(shí)現安全的自動(dòng)登錄功能,請參考本文檔前面的內容。
雖然 HTTP cookie 存在一些問(wèn)題, 但是它確實(shí)是實(shí)現會(huì )話(huà) ID 管理的優(yōu)選方案。 盡可能的僅使用 cookie 來(lái)進(jìn)行會(huì )話(huà) ID 管理, 而且大部分應用也確實(shí)是只使用 cookie 來(lái)記錄會(huì )話(huà) ID 的。
如果 session.use_only_cookies
=Off,
會(huì )話(huà)模塊會(huì )在基于 cookie 的會(huì )話(huà) ID 初始化之前
使用 GET/POST/URL 請求中的會(huì )話(huà) ID(如果存在的話(huà))。
雖然啟用 session.use_strict_mode
是必不可少的,但是默認情況下,這個(gè)配置項是未啟用的。
此設置防止會(huì )話(huà)模塊使用未初始化的會(huì )話(huà) ID。 也就是說(shuō), 會(huì )話(huà)模塊僅接受由它自己創(chuàng )建的有效的會(huì )話(huà) ID, 而拒絕由用戶(hù)自己提供的會(huì )話(huà) ID。
攻擊者可以自行設置 cookie
或者使用 JavaScript 注入的方式
來(lái)設置會(huì )話(huà) ID 進(jìn)行攻擊。
啟用 session.use_strict_mode
配置項
可以阻止使用未經(jīng)會(huì )話(huà)模塊初始化的會(huì )話(huà) ID。
注意:
攻擊者可以使用自己的設備產(chǎn)生會(huì )話(huà) ID,也可以使用受害者的會(huì )話(huà) ID。 攻擊者也可以通過(guò)一些后續操作保證會(huì )話(huà)活躍。 因此,啟用
session.use_strict_mode
配置項 可以降低這種風(fēng)險。
禁止 JavaScript 訪(fǎng)問(wèn)會(huì )話(huà) cookie。 此設置項可以保護 cookie 不被 JavaScript 竊取。
雖然可以使用會(huì )話(huà) ID 來(lái)作為防范跨站請求偽造(CSRF)的關(guān)鍵數據, 但是不建議你這么做。例如,攻擊者可以把 HTML 源代碼保存下來(lái)并且發(fā)送給其他用戶(hù)。 為了安全起見(jiàn),開(kāi)發(fā)者不應該在 web 頁(yè)面中顯示會(huì )話(huà) ID。 幾乎所有的應用都應該對會(huì )話(huà) ID cookie 設置 httponly 為 On。
注意:
類(lèi)似會(huì )話(huà) ID,CSRF 保護串號也應該定期的更新。
僅允許在 HTTPS 協(xié)議下訪(fǎng)問(wèn)會(huì )話(huà) ID cookie。 如果你的 web 站點(diǎn)僅支持 HTTPS,那么必須將此配置項設置為 On。
對于僅支持 HTTPS 的 web 站點(diǎn)建議考慮使用強制安全傳輸技術(shù)(HSTS)。
session.cookie_samesite="Lax" 或者 session.cookie_samesite="Strict"
自 PHP 7.3 開(kāi)始,可以為會(huì )話(huà) cookie 設置 "SameSite"
屬性。
這個(gè)屬性可以有效的降低 CSRF 攻擊的風(fēng)險。
Lax 和 Strict 之間的區別是, 對于來(lái)自其他站點(diǎn)的并且攜帶了會(huì )話(huà) cookie 的 GET 請求的處理方式不同。 設置為 Lax 會(huì )允許來(lái)自其他站點(diǎn)并且攜帶了會(huì )話(huà) cookie 的請求, 設置為 Strict 則不會(huì )允許這種請求訪(fǎng)問(wèn)本站的會(huì )話(huà)數據。
session.gc_maxlifetime=[選擇一個(gè)盡可能小的時(shí)間段]
session.gc_maxlifetime
來(lái)設置刪除過(guò)期會(huì )話(huà)數據的時(shí)間周期。
來(lái)的刪除,
你需要自己來(lái)實(shí)現一套基于時(shí)間戳的會(huì )話(huà)數據生命周期管理機制。
最好使用 session_gc() 函數來(lái)進(jìn)行會(huì )話(huà)數據垃圾收集。 如果你是 UNIX 的操作系統, 最好使用類(lèi)似 cron 這樣的定時(shí)任務(wù)來(lái)執行 session_gc() 函數。
GC 的運行時(shí)機并不是精準的,帶有一定的或然性, 所以這個(gè)設置項并不能確保 舊的會(huì )話(huà)數據被刪除。某些會(huì )話(huà)存儲處理模塊不使用此設置項。 更多的信息請參考會(huì )話(huà)存儲模塊的完整文檔。 雖然開(kāi)發(fā)人員不能完全依賴(lài)這個(gè)設置,但是還是建議將其設置的盡可能的小。 調整 session.gc_probability 和 session.gc_divisor 配置項 可以使得過(guò)期的會(huì )話(huà)數據在適當的周期內被刪除。 如果需要使用自動(dòng)登錄的功能, 請使用其他更加安全的方式自行實(shí)現, 而不要通過(guò)使用長(cháng)生命周期的會(huì )話(huà) ID 來(lái)實(shí)現。
注意:
如果會(huì )話(huà)存儲器將會(huì )話(huà)數據存儲到 memcached 或者 mecache 這種自帶超時(shí)機制的存儲中, 就不依賴(lài)這個(gè)配置項來(lái)進(jìn)行過(guò)期會(huì )話(huà)數據的垃圾收集。 更多信息請參考對應的會(huì )話(huà)存儲器文檔。
如果你有需要,可以使用會(huì )話(huà) ID 透傳機制。 但是,禁用會(huì )話(huà) ID 透傳機制可以 避免會(huì )話(huà) ID 被注入以及泄漏, 有效的提高會(huì )話(huà)安全性。
注意:
會(huì )話(huà) ID 可能在瀏覽器書(shū)簽或者保存下來(lái)的 HTML 源代碼中被泄漏。
session.trans_sid_tags=[限制標簽]
(PHP 7.1.0 及以上)一般情況下,默認值就可以, 你無(wú)需重寫(xiě)不需要的標簽。 之前版本的 PHP 請使用 url_rewriter.tags 配置項。
session.trans_sid_hosts=[限制的主機名]
(PHP 7.1.0 及以上)這個(gè)配置項設定允許進(jìn)行會(huì )話(huà) ID 透傳的主機白名單。
請勿在其中加入你不信任的主機。
如果此配置項為空,
則僅允許 $_SERVER['HTTP_HOST']
的站點(diǎn)進(jìn)行會(huì )話(huà) ID 透傳。
session.referer_check=[原始 URL]
當啟用 session.use_trans_sid 配置項的時(shí)候, 這個(gè)設置可以降低會(huì )話(huà) ID 注入的風(fēng)險。 如果你的站點(diǎn)是 http://example.com/, 那么就把此項設置為 http://example.com/。 需要注意的是,如果使用了 HTTPS 協(xié)議, 那么瀏覽器在發(fā)起請求的時(shí)候不會(huì )包含 referrer 請求頭。 建議啟用此配置項,雖然它并不是可靠的安全措施。
session.cache_limiter=nocache
確保對于已經(jīng)認證的會(huì )話(huà),其 HTTP 內容不會(huì )被瀏覽器緩存。 應該僅針對公開(kāi)內容允許緩存, 否則將會(huì )面臨內容泄露的風(fēng)險。 即使 HTTP 內容不包含敏感數據, 也可以把它設置為“private”。 注意,“private”可能會(huì )導致客戶(hù)端緩存私有數據。 僅在 HTTP 內容中不包含任何私有數據的時(shí)候,可以使用“public”。
session.sid_length="48"
(PHP 7.1.0 及更高版本)更長(cháng)的會(huì )話(huà) ID 可以得到更高的安全強度。 建議開(kāi)發(fā)者將會(huì )話(huà) ID 的長(cháng)度設置為不低于 32 個(gè)字符。 當 session.sid_bits_per_character="5" 時(shí), 會(huì )話(huà) ID 至少需要 26 個(gè)字符。
session.sid_bits_per_character="6"
(PHP 7.1.0 及更高版本) 即使會(huì )話(huà) ID 的長(cháng)度設定不變, 更高的會(huì )話(huà) ID 比特位設置也會(huì )產(chǎn)生安全性更高的會(huì )話(huà) ID。
session.hash_function="sha256"
(PHP 7.1.0 及更高版本)高強度的哈希算法可以生成更高安全性的會(huì )話(huà) ID。 雖然說(shuō),即使是采用 MD5 哈希算法,要想生成完全一致的哈希結果都是不太現實(shí)的, 但是還是建議開(kāi)發(fā)者使用 SHA-2 或者更高強度的哈希算法。 比如,可以考慮使用 sha384 和 sha512 哈希算法。 請確保 entropy 配置項的設置可以滿(mǎn)足你所用的哈希算法對種子長(cháng)度要求。
session.save_path=[非全局可讀目錄](méi)
如果設置為類(lèi)似 /tmp(默認選項)的全局可讀目錄, 該服務(wù)器上的其他用戶(hù)可以通過(guò)獲取目錄中的文件,劫持 session。