即使在關閉瀏覽器或在 PHP 中閒置一段時間後返回後,如何保持使用者會話處於活動狀態?
P粉826429907
2023-09-03 08:53:53
<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
。