mysql 在PHP中,如何在关闭浏览器或空闲一段时间后返回时保持用户的会话处于活动状态?

sqserrrh  于 2023-04-04  发布在  Mysql
关注(0)|答案(1)|浏览(143)

在我的代码中,我可以选择“记住我”,当选中时,将电子邮件和密码的值保存在cookie中,cookie持续1个月,现在,当用户再次进入页面时,会话不会保持活动状态,但它确实从保存的cookie中获取值并将其显示在登录表单上。我已经尝试建立这些代码行:

php_value session.cookie_lifetime 2629800;
php_value session.gc_maxlifetime 2629800;

在php.ini和.htacces中,但结果是相同的(当用户关闭浏览器时,会话被关闭)。
这是loginUser函数,它处理登录并在用户选中“记住我”时创建一个cookie,我想要的是,通过选中提醒我,即使用户关闭浏览器或在一段时间不活动后返回,会话也保持活动状态,但会话的持续时间为1个月(2629800s)。

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();
    }
}

PS:我知道这是重复的,但是上面的问题都没有解决我的问题。
我再次提到,我试图在htaccess和php.ini中设置这些行,但没有成功:

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();

另外值得一提的是,通过在关闭浏览器并重新打开时建立代码行,会话仍然处于活动状态,但最多只能持续2小时。

3htmauhk

3htmauhk1#

TL;DRsetcookie的生存期与$_SESSION的默认PHPSESSID cookie的生存期混淆。

要使$_SESSION遵守所需的生存期,必须更新其PHPSESSID cookie以将默认cookie_lifetime从零更改为一个月。这涉及手动管理$_SESSION。以下是手动管理$_SESSION的示例工作流:
1.设置session_name。(可以设置PHPSESSID的替代cookie名称。)
1.配置会话选项。(这可以包括设置cookie_lifetime。)

  1. Create和/或set会话_id。
  2. Start会话。(此步骤基于session_id填充$_SESSION。)
    1.验证会话。(检查session_id和其他身份验证参数是否有效。)
    1.访问和修改$_SESSION值。
  3. Close会话。(在向客户端发送session_id之前阻止$_SESSION进一步更改。)
    Session Management Basics上的这个链接应该会有帮助。你也可以阅读有关PHP Session Fixation / Hijacking的内容。
    在评论中RiggsFolly提供了一些建议,Chris哈斯也发布了一个很好的参考。像参考这样的解决方案似乎建议存储一个随机字符串作为用户查找键,以及一个更长的哈希字符串用于验证。查找和非哈希验证字符串将使用setcookie,而其他值可以使用$_SESSION

相关问题