和會話安全相關的配置項

通過使用 INI 文件中和會話安全相關的配置項,來提高會話的安全性。 有一些重要的配置項沒有默認值, 所以你需要自行設置。

  • session.cookie_lifetime=0

    0 表示特殊含義,它告知瀏覽器不要持久化存儲 cookie 數據。 也即,關閉瀏覽器的時候,會話 ID cookie 會被立即刪除。 如果將此項設置為非 0 的值, 可能會導致會話 ID 被其他用戶使用。 大部分應用應該把此項設置為 "0"。

    如果應用中有自動登錄的功能, 請自行實現(xiàn)一種更加安全的方式, 而不要使用長生命周期的會話 ID 來完成自動登錄。 至于如何實現(xiàn)安全的自動登錄功能,請參考本文檔前面的內容。

  • session.use_cookies=On

    session.use_only_cookies=On

    雖然 HTTP cookie 存在一些問題, 但是它確實是實現(xiàn)會話 ID 管理的優(yōu)選方案。 盡可能的僅使用 cookie 來進行會話 ID 管理, 而且大部分應用也確實是只使用 cookie 來記錄會話 ID 的。

    如果 session.use_only_cookies=Off, 會話模塊會在基于 cookie 的會話 ID 初始化之前 使用 GET/POST/URL 請求中的會話 ID(如果存在的話)。

  • session.use_strict_mode=On

    雖然啟用 session.use_strict_mode 是必不可少的,但是默認情況下,這個配置項是未啟用的。

    此設置防止會話模塊使用未初始化的會話 ID。 也就是說, 會話模塊僅接受由它自己創(chuàng)建的有效的會話 ID, 而拒絕由用戶自己提供的會話 ID。

    攻擊者可以自行設置 cookie 或者使用 JavaScript 注入的方式 來設置會話 ID 進行攻擊。 啟用 session.use_strict_mode 配置項 可以阻止使用未經會話模塊初始化的會話 ID。

    注意:

    攻擊者可以使用自己的設備產生會話 ID,也可以使用受害者的會話 ID。 攻擊者也可以通過一些后續(xù)操作保證會話活躍。 因此,啟用 session.use_strict_mode 配置項 可以降低這種風險。

  • session.cookie_httponly=On

    禁止 JavaScript 訪問會話 cookie。 此設置項可以保護 cookie 不被 JavaScript 竊取。

    雖然可以使用會話 ID 來作為防范跨站請求偽造(CSRF)的關鍵數據, 但是不建議你這么做。例如,攻擊者可以把 HTML 源代碼保存下來并且發(fā)送給其他用戶。 為了安全起見,開發(fā)者不應該在 web 頁面中顯示會話 ID。 幾乎所有的應用都應該對會話 ID cookie 設置 httponly 為 On。

    注意:

    類似會話 ID,CSRF 保護串號也應該定期的更新。

  • session.cookie_secure=On

    僅允許在 HTTPS 協(xié)議下訪問會話 ID cookie。 如果你的 web 站點僅支持 HTTPS,那么必須將此配置項設置為 On。

    對于僅支持 HTTPS 的 web 站點建議考慮使用強制安全傳輸技術(HSTS)。

  • session.cookie_samesite="Lax" 或者 session.cookie_samesite="Strict"

    自 PHP 7.3 開始,可以為會話 cookie 設置 "SameSite" 屬性。 這個屬性可以有效的降低 CSRF 攻擊的風險。

    Lax 和 Strict 之間的區(qū)別是, 對于來自其他站點的并且攜帶了會話 cookie 的 GET 請求的處理方式不同。 設置為 Lax 會允許來自其他站點并且攜帶了會話 cookie 的請求, 設置為 Strict 則不會允許這種請求訪問本站的會話數據。

  • session.gc_maxlifetime=[選擇一個盡可能小的時間段]

    session.gc_maxlifetime 來設置刪除過期會話數據的時間周期。 的刪除, 你需要自己來實現(xiàn)一套基于時間戳的會話數據生命周期管理機制。

    最好使用 session_gc() 函數來進行會話數據垃圾收集。 如果你是 UNIX 的操作系統(tǒng), 最好使用類似 cron 這樣的定時任務來執(zhí)行 session_gc() 函數。

    GC 的運行時機并不是精準的,帶有一定的或然性, 所以這個設置項并不能確保 舊的會話數據被刪除。某些會話存儲處理模塊不使用此設置項。 更多的信息請參考會話存儲模塊的完整文檔。 雖然開發(fā)人員不能完全依賴這個設置,但是還是建議將其設置的盡可能的小。 調整 session.gc_probabilitysession.gc_divisor 配置項 可以使得過期的會話數據在適當的周期內被刪除。 如果需要使用自動登錄的功能, 請使用其他更加安全的方式自行實現(xiàn), 而不要通過使用長生命周期的會話 ID 來實現(xiàn)。

    注意:

    如果會話存儲器將會話數據存儲到 memcached 或者 mecache 這種自帶超時機制的存儲中, 就不依賴這個配置項來進行過期會話數據的垃圾收集。 更多信息請參考對應的會話存儲器文檔。

  • session.use_trans_sid=Off

    如果你有需要,可以使用會話 ID 透傳機制。 但是,禁用會話 ID 透傳機制可以 避免會話 ID 被注入以及泄漏, 有效的提高會話安全性。

    注意:

    會話 ID 可能在瀏覽器書簽或者保存下來的 HTML 源代碼中被泄漏。

  • session.trans_sid_tags=[限制標簽]

    (PHP 7.1.0 及以上)一般情況下,默認值就可以, 你無需重寫不需要的標簽。 之前版本的 PHP 請使用 url_rewriter.tags 配置項。

  • session.trans_sid_hosts=[限制的主機名]

    (PHP 7.1.0 及以上)這個配置項設定允許進行會話 ID 透傳的主機白名單。 請勿在其中加入你不信任的主機。 如果此配置項為空, 則僅允許 $_SERVER['HTTP_HOST'] 的站點進行會話 ID 透傳。

  • session.referer_check=[原始 URL]

    當啟用 session.use_trans_sid 配置項的時候, 這個設置可以降低會話 ID 注入的風險。 如果你的站點是 http://example.com/, 那么就把此項設置為 http://example.com/。 需要注意的是,如果使用了 HTTPS 協(xié)議, 那么瀏覽器在發(fā)起請求的時候不會包含 referrer 請求頭。 建議啟用此配置項,雖然它并不是可靠的安全措施。

  • session.cache_limiter=nocache

    確保對于已經認證的會話,其 HTTP 內容不會被瀏覽器緩存。 應該僅針對公開內容允許緩存, 否則將會面臨內容泄露的風險。 即使 HTTP 內容不包含敏感數據, 也可以把它設置為“private”。 注意,“private”可能會導致客戶端緩存私有數據。 僅在 HTTP 內容中不包含任何私有數據的時候,可以使用“public”。

  • session.sid_length="48"

    (PHP 7.1.0 及更高版本)更長的會話 ID 可以得到更高的安全強度。 建議開發(fā)者將會話 ID 的長度設置為不低于 32 個字符。 當 session.sid_bits_per_character="5" 時, 會話 ID 至少需要 26 個字符。

  • session.sid_bits_per_character="6"

    (PHP 7.1.0 及更高版本) 即使會話 ID 的長度設定不變, 更高的會話 ID 比特位設置也會產生安全性更高的會話 ID。

  • session.hash_function="sha256"

    (PHP 7.1.0 及更高版本)高強度的哈希算法可以生成更高安全性的會話 ID。 雖然說,即使是采用 MD5 哈希算法,要想生成完全一致的哈希結果都是不太現(xiàn)實的, 但是還是建議開發(fā)者使用 SHA-2 或者更高強度的哈希算法。 比如,可以考慮使用 sha384 和 sha512 哈希算法。 請確保 entropy 配置項的設置可以滿足你所用的哈希算法對種子長度要求。

  • session.save_path=[非全局可讀目錄]

    如果設置為類似 /tmp(默認選項)的全局可讀目錄, 該服務器上的其他用戶可以通過獲取目錄中的文件,劫持 session。