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