質問: $row['username']; header('Location: http://127.0.0.1/login.php'); ``` のようにレコードを取り出せたらsession_regenerate_id(TRUE);を宣言してセッション変数に取り出したユーザー名を入れてlogin.phpに飛ばすという大雑把な流れなんですが、ここら辺に問題があるのでしょうか?
回答: ご認識はおそらく正しく、実装が間違っているような気がします。 session_regenerate_id(TRUE); はどのタイミングで実行されているでしょうか? 正しいタイミングは、IDとパスワードの確認が終わった直後、セッション変数にログイン状態を書き込む前です。そのようになっていますか? よろしければ、該当箇所のソースコードを添付いただけると、もう少し詳しく確認できるかと思いますので、よろしくお願いします。 コメント拝見しました。コードに問題はありません。ちょっと私の受け取り方が間違っていたようです。 > > 対象がログインしている状態であれば何らかの形でセッションIDを盗みさえできれば乗っ取りも容易ってことですよね? > > > セッションIDを盗まれたら乗っ取りされます。なので、セッションIDを盗まれないようにしなければなりません。通信路をSSLにするとか、クッキーにセキュア属性をつけるとか、クロスサイトスクリプティング対策をするなどは、セッションIDを盗まれないための施策です。 一方、セッションIDを盗むのでなく、攻撃者がもっているセッションIDを被害者のブラウザにセットするという「セッション固定」という攻撃があります。攻撃者のセッションIDのままログインしてしまうと、そのセッションIDは攻撃者が知っているので、「ログイン済みセッションIDを攻撃者が知っている」状態が作れてしまいます。それを防ぐのが、session_regenerate_id(TRUE)の呼び出しです。 > > 一つお聞きしたいのが、ログイン時にセッションを発行するならsession_regenerate_id(TRUE)はあってもなくてもあんま関係無いのではないでしょうか > > > これはダメです。ログイン時にセッションを初めて発行したとしても、元々セッションCookieがあった場合には、PHPはそのセッションCookieを受け入れます。セッション固定攻撃の文脈では、その「元々あったCookie」は攻撃者が知っているCookieです。なので、session_regenerate_id(TRUE);を実行して、攻撃者の知らないセッションIDに切り替える必要があります。 もっと言えば、session_start();という関数は、 1. セッションCookieがあればそのまま使う 2. セッションCookieがなければ新たに発行する という動作を行います。「ログイン時に(新たに)セッションを発行する」ということはできないのです。