首页 >后端开发 >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.cookie_lifetime 等选项用于会话过期,它们并不完全可靠。这是实现您自己的会话超时机制的综合方法。

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