和會話安全相關(guān)的配置項

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

  • session.cookie_lifetime=0

    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)容。

  • session.use_cookies=On

    session.use_only_cookies=On

    雖然 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=On

    雖然啟用 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)險。

  • session.cookie_httponly=On

    禁止 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)該定期的更新。

  • session.cookie_secure=On

    僅允許在 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_probabilitysession.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)的會話存儲器文檔。

  • session.use_trans_sid=Off

    如果你有需要,可以使用會話 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。