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