Heim  >  Fragen und Antworten  >  Hauptteil

Wie kann eine Benutzersitzung auch nach dem Schließen des Browsers oder nach der Rückkehr nach längerem Leerlauf in PHP aktiv bleiben?

<p>In meinem Code kann ich „Angemeldet bleiben“ auswählen. Wenn diese Option ausgewählt wird, wird der Wert von E-Mail und Passwort in einem Cookie gespeichert und das Cookie bleibt 1 Monat lang bestehen, jetzt wenn der Benutzer die Seite erneut betritt, anstatt die Sitzung beizubehalten aktiv, ruft es den Wert aus dem gespeicherten Cookie ab und zeigt ihn im Anmeldeformular an. Ich verwende derzeit Cloudflare und Hosting und habe versucht, diese Codezeilen einzurichten: </p> <pre class="brush:php;toolbar:false;">php_value session.cookie_lifetime 2629800; php_value session.gc_maxlifetime 2629800;</pre> <p>Beide befinden sich in php.ini und .htacces, aber das Ergebnis ist das gleiche (die Sitzung wird geschlossen, wenn der Benutzer den Browser schließt). </p> <p>Dies ist die loginUser-Funktion. Sie verwaltet die Anmeldung und erstellt das Cookie, wenn der Benutzer „An mich erinnern“ ankreuzt. Was ich möchte, ist, indem ich „An mich erinnern“ ankreuze, auch wenn der Benutzer den Browser schließt oder danach zurückkommt Einige Zeit lang bleibt die Sitzung für die Zeit der Inaktivität aktiv, die Sitzungsdauer beträgt jedoch 1 Monat (2629800 Sekunden).</p> <pre class="brush:php;toolbar:false;">function loginUser($email, $password, $rememberme) { $mysqli = connect(); $email = trim($email); $password = trim($password); if ($email == "" || $password == "") { return 'Beide Felder sind erforderlich'; } $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 „Die E-Mail existiert nicht, melden Sie sich an, um teilzunehmen“; } if (password_verify($password, $data["password"]) == FALSE) { return „Das Passwort ist falsch, bitte überprüfen Sie es und versuchen Sie es erneut“; } anders { $user_id = $data['user_id']; $_SESSION['auth_user_id'] = $user_id; $_SESSION["user"] = $email; $_SESSION["pass"] = $password; $_SESSION["Benutzername"] = $data['Benutzername']; $_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"); Ausfahrt(); } }</pre> <p>PS:我知道这是重复的,但上面的问题都没有解决我的问题.</p> <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; // Wir wählen eine Laufzeit von einem Jahr ini_set('session.gc_maxlifetime', $expire); session_start();</pre> <p>还值得一提的是,但最多只能持续 2 Monate.</p>
P粉826429907P粉826429907413 Tage vor438

Antworte allen(1)Ich werde antworten

  • 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

    Antwort
    0
  • StornierenAntwort