ブラウザを閉じた後、または 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関数です。ユーザーが「Remind Me」をチェックしたときにログインを処理し、Cookieを作成します。私が望んでいるのは、ユーザーがブラウザを閉じたり、ブラウザを閉じた後に戻ってきたりしても、「Remind Me」をチェックすることです。しばらくの間、セッションは非アクティブな間アクティブなままになりますが、セッションの期間は 1 か月 (2629800 秒) です。 </p>
<pre class="brush:php;toolbar:false;">関数 loginUser($email, $password, $rememberme)
{
$mysqli = 接続();
$email = トリム($email);
$パスワード = トリム($パスワード);
if ($email == "" || $password == "") {
return '両方のフィールドが必須です';
}
$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 '電子メールが存在しません。サインアップして入力してください';
}
if (password_verify($password, $data["password"]) == FALSE) {
return 'パスワードが間違っています。確認してもう一度お試しください';
} それ以外 {
$user_id = $data['user_id'];
$_SESSION['auth_user_id'] = $user_id;
$_SESSION["ユーザー"] = $email;
$_SESSION["パス"] = $パスワード;
$_SESSION["ユーザー名"] = $data['ユーザー名'];
$_SESSION["検証"] = $data['検証'];
$_SESSION["プロファイル"] = $data['プロファイル画像'];
$_SESSION["id"] = $data['user_id'];
$_SESSION["vip"] = $data['vip'];
setcookie('user_id', $data['user_id'], time() 60 * 60 * 24 * 30, '/');
if ($rememberme) {
$cookie_name = '米国を記憶';
$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("場所:index.php");
出口();
}
}</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;
//functions.php内
$expire = 60*60*24*30; // 1 年間の期間を選択します
ini_set('session.gc_maxlifetime', $expire);
session_start();</pre>
<p>ブラウザを閉じて再度開くときにコード行を確立することにより、セッションはアクティブのままになりますが、最大 2 時間のみであることにも言及する価値があります。 </p>
TL;DR
setcookie
ライフサイクルは、$_SESSION
> のデフォルトのPHPSESSID
Cookie ライフサイクルと混同されます。$_SESSION
が必要な有効期間を遵守するには、その
PHPSESSIDCookie を更新して、cookie_lifetime をデフォルト値から 1 か月に変更する必要があります。これには、
$_SESSIONの手動管理が含まれます。以下は、
$_SESSIONを手動で管理するためのワークフローの例です:
設定- セッション名。 (PHPSESSID の代わりの Cookie 名を設定できます。)
セッション オプションを構成します。 (これには、- cookie_lifetime の設定が含まれる場合があります。)
-
を作成するか、 session_id を設定します。
-
セッションを開始します。 (このステップでは、session_id に基づいて $_SESSION
セッションを確認します。 (session_id などの認証パラメータが有効かどうかを確認してください。) -
- $_SESSION
-
セッションを閉じます。 (session_id がクライアントに送信される前に、$_SESSION
が設定されます。)
値にアクセスして変更します。
がさらに変更を加えるのを防ぎます。)
セッション管理の基本 のこのリンクが役立ちます。 PHP セッションの修復/ハイジャックを読むこともできます。
コメントの中で、RiggsFolly は検討に値するアドバイスを提供し、Chris Haas は素晴らしい参考資料を投稿しました。リファレンスのような解決策では、ランダムな文字列をユーザー検索キーとして保存し、検証用に長いハッシュ文字列を保存することを提案しているようです。ルックアップと非ハッシュ検証文字列はsetcookie
を使用しますが、他の値は
$_SESSIONを使用できます。