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粉826429907
2023-09-03 08:53:53
<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>
TL;DR
setcookie
生命周期与$_SESSION
的默认PHPSESSID
cookie 生命周期相混淆>.要使
$_SESSION
遵守所需的生命周期,必须更新其PHPSESSID
cookie,将 cookie_lifetime 从默认值更改为一个月。这涉及手动管理$_SESSION
。以下是手动管理$_SESSION
的示例工作流程:$_SESSION
。)$_SESSION
值。$_SESSION
进行进一步更改。)会话管理基础知识上的此链接应该乐于助人。您还可以阅读PHP 会话固定/劫持。
在评论中,RiggsFolly 提供了值得思考的建议,Chris Haas 发布了一个很好的参考。像参考文献这样的解决方案似乎建议存储一个随机字符串作为用户查找密钥,并存储一个更长的散列字符串以进行验证。查找和非哈希验证字符串将使用
setcookie
,而其他值可以使用$_SESSION
。