0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP】session_regenerate_id(true)でセッションが切れる問題

Posted at

問題:
ログイン後、セッションが切れたかのように扱われ、ログインしていない状態になることがある。
しかし、session_regenerate_id(true);を削除すると、セッションが切れなくなった。
原因:

qiita.php
session_start();
// ログイン成功時
if (!isset($_SESSION['loggedin'])) {
    $_SESSION['loggedin'] = true; // ログインフラグを設定
    session_regenerate_id(true); // セッションIDを再生成
}
// ログイン済みの確認
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) {
    echo "ログイン中です。";
} else {
    echo "ログインしていません。ログインページにリダイレクトします。";
}

session_regenerate_id(true)は、新しいセッションIDを生成するための関数であり、trueを指定すると古いセッションデータが削除される。
問題の原因は、ログイン認証時に一度この関数を使用しているにもかかわらず、フロントエンドの処理でも再度使用している点にある。その結果、$_SESSION['loggedin'] = trueが削除され、ログインしていない状態とみなされる。

また、セッション管理はサーバーの設定やセッション保存ハンドラにも依存する。session_regenerate_id(true)を使用した場合、新しいセッションIDが生成されるとともに、通常はセッションデータが保持される。しかし、サーバーの設定や実装によっては、セッションデータが引き継がれないこともある。
さらに、PHP 7.x以降ではセッションデータが新しいセッションIDに引き継がれるよう改善されているが、PHP 7.x未満のバージョンではデータが失われる場合がある。

解決策:

qiita.php
session_start();
// ログイン成功時
if (!isset($_SESSION['loggedin'])) {
    $_SESSION['loggedin'] = true; // ログインフラグを設定
    // session_regenerate_id(true); ログイン認証を行った直後のみにする
}
// ログイン済みの確認
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) {
    echo "ログイン中です。";
} else {
    echo "ログインしていません。ログインページにリダイレクトします。";
}

session_regenerate_id(true) を呼び出すのはログイン認証を行った直後のみにすること。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?