PHP:用户注销



我有一个自定义编写的PHP应用程序。建于15年前。直到最近,当用户报告他们被注销时,即使他们正在积极使用该应用程序,也能正常工作。

我们使用PHP会话来管理用户。会话到期时间设置为12小时不活动。我再现了被注销的问题。没有模式。有时我会在30分钟后注销,有时是2小时,有时是40分钟,以此类推。我捕获了PHP会话cookie,并检查相应的PHP会话文件是否存在于服务器的tmp目录中。即使应用程序让我注销,会话文件也在服务器上,而且还不到2小时(到期时间为12小时(。

如果我打印$_SESSION,这个问题不会出现那么多。在Chrome和Firefox中复制了该问题。我只在注销服务中有session_startsession_destroy

有什么线索可以引起这种情况吗?

我有几次遇到同样的问题。解决方法:使用";记住我";用于自动登录的cookie。

这是一个食谱:

每当用户登录成功运行此:

// remember me for a year every login
$login_string = hash('sha512', $user_id . $_SERVER['HTTP_USER_AGENT'] . time());
Project::update_table_record('users', $user_id, ["remember_me" => $login_string]);
$cookie_name = COOKIE_REMEMBER_ME;
$cookie_value = $login_string;
setcookie($cookie_name, $cookie_value, time() + (86400 * 365), "/"); // 365 day example

每当用户选择注销时,给他一个选项:

setcookie(COOKIE_REMEMBER_ME, "", time() - 3600, "/");

否则,如果没有会话,则在cookie有效的情况下重新登录。

// auto login / remember me!
if (!LiveUser::get_id()) {
if (isset($_COOKIE[COOKIE_REMEMBER_ME])) {
$user_string = $_COOKIE[COOKIE_REMEMBER_ME];
$user_id = Project::get_value('users', ['remember_me' => $user_string], 'id');
if ($user_id) {
Project::do_login($user_id);
}
}
}

最新更新