搜尋

首頁  >  問答  >  主體

即使在關閉瀏覽器或在 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;">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>
P粉826429907P粉826429907468 天前479

全部回覆(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
  • 取消回覆