首頁 >後端開發 >php教程 >如何在 30 分鐘不活動後可靠地使 PHP 會話過期?

如何在 30 分鐘不活動後可靠地使 PHP 會話過期?

Barbara Streisand
Barbara Streisand原創
2024-12-24 22:56:15374瀏覽

How to Reliably Expire a PHP Session After 30 Minutes of Inactivity?

如何在30 分鐘後有效地使PHP 會話過期

雖然PHP 提供了session.gc_maxlifetime 和session.cookies 等選項會話過期,它們並不完全可靠。這是實現您自己的會話超時機制的綜合方法。

PHP 內建選項的問題:

  • session.gc_maxlifetime :它指定會話資料並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」並何時被視為「垃圾」在會話啟動期間清除。但是,垃圾收集器偶爾運行,預設機率僅為 1%,可能會導致會話過早終止。
  • session.cookie_lifetime:此選項決定傳送的會話 cookie 的生命週期到瀏覽器。但是,它不會使會話本身失效,這仍然是伺服器的責任。

實現自訂會話逾時:

使會話過期的最有效方法session 在特定時間段不活動後是為了實現您自己的超時機制。這涉及維護最後一個活動(請求)的時間戳並根據每個請求更新它。如果上次活動超過 30 分鐘前,您可以取消設定並銷毀會話。

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset(); // unset $_SESSION variable for the run-time
    session_destroy(); // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

透過不斷更新會話數據,可以防止垃圾收集器過早刪除會話檔案的修改日期。

額外安全措施:

防止會話等攻擊固定,您可以透過更新 $_SESSION['CREATED'] 時間戳定期重新產生會話ID:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true); // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time(); // update creation time
}

注意:

  • 確保會話。 gc_maxlifetime 設定為至少等於自訂過期處理程序的生命週期的值(在此為 1800)範例)。
  • 要在活動 30 分鐘後(而不是從開始後)使會話過期,請使用 setcookie 並將過期時間設為 time() 60 * 30 以保持會話 cookie 處於活動狀態。

以上是如何在 30 分鐘不活動後可靠地使 PHP 會話過期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn