首页  >  问答  >  正文

即使在关闭浏览器或在 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;">函数loginUser($email, $password, $rememberme) { $mysqli = 连接(); $电子邮件=修剪($电子邮件); $密码=修剪($密码); if ($email == "" || $password == "") { return '两个字段都是必填的'; } $email = filter_var($email, FILTER_SANITIZE_EMAIL); $password = filter_var($password, FILTER_SANITIZE_SPECIAL_CHARS); $sql = 'SELECT * FROM users WHERE email = ?限制 1”; $stmt = $mysqli->准备($sql); $stmt->bind_param("s", $email); $stmt->execute(); $result = $stmt->get_result(); $data = $result->fetch_assoc(); 如果($数据== NULL){ return '该邮箱不存在,注册进入'; } if (password_verify($password, $data[“密码”]) == FALSE) { return '密码不正确,请检查并重试'; } 别的 { $user_id = $data['user_id']; $_SESSION['auth_user_id'] = $user_id; $_SESSION[“用户”] = $电子邮件; $_SESSION["pass"] = $password; $_SESSION["用户名"] = $data['用户名']; $_SESSION[“验证”] = $data['验证']; $_SESSION["个人资料"] = $data['profileImage']; $_SESSION["id"] = $data['user_id']; $_SESSION["vip"] = $data['vip']; setcookie('user_id', $data['user_id'], time() + 60 * 60 * 24 * 30, '/'); 如果($记住我){ $cookie_name = 'Remember_US'; $cookie_value = json_encode(array('lemail' => $email, 'lpassword' => $password)); $cookie_expire = 时间() + (60 * 60 * 24 * 30); setcookie($cookie_name, 加密($cookie_value), $cookie_expire, '/', null, true, true); } header(“位置:index.php”); 出口(); } }</pre> <p>PS:我知道这是重复的,但上面的问题都没有解决我的问题。</p> <p>我再次提到,我尝试在 htaccess 和 php.ini 中设置这些行,但没有成功:</p>
php_value session.cookie_lifetime 2629800;
php_value 会话.gc_maxlifetime 2629800;

//在functions.php中
$过期= 60 * 60 * 24 * 30; // 我们选择一年的持续时间
ini_set('session.gc_maxlifetime', $expire);
session_start();</pre>
<p>还值得一提的是,通过在关闭浏览器并重新打开浏览器时建立代码行,会话保持活动状态,但最多只能持续 2 小时。</p>
P粉826429907P粉826429907413 天前440

全部回复(1)我来回复

  • P粉549986089

    P粉5499860892023-09-04 00:49:29

    TL;DR setcookie 生命周期与 $_SESSION 的默认 PHPSESSID cookie 生命周期相混淆>.

    要使 $_SESSION 遵守所需的生命周期,必须更新其 PHPSESSID cookie,将 cookie_lifetime 从默认值更改为一个月。这涉及手动管理 $_SESSION。以下是手动管理 $_SESSION 的示例工作流程:

    1. 设置session_name。 (可以设置 PHPSESSID 的替代 cookie 名称。)
    2. 配置会话选项。 (这可以包括设置 cookie_lifetime.)
    3. 创建和/或设置 session_id。
    4. 启动会话。 (此步骤根据 session_id 填充 $_SESSION。)
    5. 验证会话。 (检查session_id等认证参数是否有效。)
    6. 访问和修改 $_SESSION 值。
    7. 关闭会话。 (在将 session_id 发送到客户端之前阻止 $_SESSION 进行进一步更改。)

    会话管理基础知识上的此链接应该乐于助人。您还可以阅读PHP 会话固定/劫持

    在评论中,RiggsFolly 提供了值得思考的建议,Chris Haas 发布了一个很好的参考。像参考文献这样的解决方案似乎建议存储一个随机字符串作为用户查找密钥,并存储一个更长的散列字符串以进行验证。查找和非哈希验证字符串将使用 setcookie,而其他值可以使用 $_SESSION

    回复
    0
  • 取消回复