即使在关闭浏览器或在 PHP 中闲置一段时间后返回后,如何保持用户会话处于活动状态?
<p>在我的代码中,我可以选择“记住我”,选中后会将电子邮件和密码的值保存在 cookie 中,并且 cookie 持续 1 个月,现在,当用户再次进入页面时,会话它不是保持活动状态,而是从保存的 cookie 中获取值并将其显示在登录表单上。
我目前正在使用 cloudflare 和托管,我已经尝试建立这些代码行:</p>
<pre class="brush:php;toolbar:false;">php_value session.cookie_lifetime 2629800;
php_value session.gc_maxlifetime 2629800;</pre>
<p>都在 php.ini 和 .htacces 中,但结果是相同的(当用户关闭浏览器时,会话将关闭)。</p>
<p>这是 loginUser 函数,它处理登录并在用户选中“记住我”时创建 cookie,我想要的是,通过选中“提醒我”,即使用户关闭浏览器或在一段时间后返回,会话仍保持活动状态不活动时间,但会话持续时间为 1 个月(2629800 秒)。</p>
<pre class="brush:php;toolbar:false;">function loginUser($email, $password, $rememberme)
{
$mysqli = connect();
$email = trim($email);
$password = trim($password);
if ($email == "" || $password == "") {
return 'Both fields are required';
}
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
$password = filter_var($password, FILTER_SANITIZE_SPECIAL_CHARS);
$sql = "SELECT * FROM users WHERE email = ? LIMIT 1";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
$data = $result->fetch_assoc();
if ($data == NULL) {
return 'The email does not exist, sign up to enter';
}
if (password_verify($password, $data["password"]) == FALSE) {
return 'The password is incorrect, please check and try again';
} else {
$user_id = $data['user_id'];
$_SESSION['auth_user_id'] = $user_id;
$_SESSION["user"] = $email;
$_SESSION["pass"] = $password;
$_SESSION["username"] = $data['username'];
$_SESSION["verify"] = $data['verify'];
$_SESSION["profile"] = $data['profileImage'];
$_SESSION["id"] = $data['user_id'];
$_SESSION["vip"] = $data['vip'];
setcookie('user_id', $data['user_id'], time() + 60 * 60 * 24 * 30, '/');
if ($rememberme) {
$cookie_name = 'Remember_US';
$cookie_value = json_encode(array('lemail' => $email, 'lpassword' => $password));
$cookie_expire = time() + (60 * 60 * 24 * 30);
setcookie($cookie_name, encrypt($cookie_value), $cookie_expire, '/', null, true, true);
}
header("location: index.php");
exit();
}
}</pre>
<p>PS:我知道这是重复的,但上面的问题都没有解决我的问题。</p>
<p>我再次提到,我尝试在 htaccess 和 php.ini 中设置这些行,但没有成功:</p>
<pre class="brush:php;toolbar:false;">php_value session.cookie_lifetime 2629800;
php_value session.gc_maxlifetime 2629800;
//In functions.php
$expire = 60*60*24*30; // We choose a one year duration
ini_set('session.gc_maxlifetime', $expire);
session_start();</pre>
<p>还值得一提的是,通过在关闭浏览器并重新打开浏览器时建立代码行,会话保持活动状态,但最多只能持续 2 小时。</p>
TL;DR
setcookie
生命周期与$_SESSION
的默认PHPSESSID
cookie 生命周期相混淆>.要使
$_SESSION
遵守所需的生命周期,必须更新其PHPSESSID
cookie,将 cookie_lifetime 从默认值更改为一个月。这涉及手动管理$_SESSION
。以下是手动管理$_SESSION
的示例工作流程:$_SESSION
。)$_SESSION
值。$_SESSION
进行进一步更改。)会话管理基础知识上的此链接应该乐于助人。您还可以阅读PHP 会话固定/劫持。
在评论中,RiggsFolly 提供了值得思考的建议,Chris Haas 发布了一个很好的参考。像参考文献这样的解决方案似乎建议存储一个随机字符串作为用户查找密钥,并存储一个更长的散列字符串以进行验证。查找和非哈希验证字符串将使用
setcookie
,而其他值可以使用$_SESSION
。