

PHP初心者です

PHPのセッションハイジャック対策で挙げられている

[code]

    session_regenerate_id(TRUE);
    
[/code]

って必要なんでしょうか

というのも自分でセッションを使った簡易なログインシステムを作りまして、  
index.phpからユーザー名とパスワードを入力してDBからユーザー名とパスワードが取り出せたらlogin.phpにいけるというシステムなんですが

ヘッダー情報を閲覧するツールを使いまして。  
ログインした際にヘッダー情報に流れるPHPSESSIDを使って  
curl --cookie "PHPSESSID=セッションID" localhost/login.php  
みたいな感じにクッキー情報にセッションIDを入れてcurlを打ったらログイン画面の内容が表示されました  
○○○さん(ユーザー名)こんにちは。 みたいな感じです

session_regenerate_id(TRUE);  
を使っていたのでPOSTする際にセッションIDを毎度発行してくれると思ったのですが  
同じセッションIDをヘッダー情報に混ぜてもログインできたのでこれはつまり対象がログインしている状態であれば何らかの形でセッションIDを盗みさえできれば乗っ取りも容易ってことですよね？

session_regenerate_id(TRUE);の意味ってなんなんでしょうか  
何か根本的な事を理解してない事は自覚してるのですがパっとしません。・。・・

> ockeghem氏

index.phpの一部のコードです

[code]

    if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        session_regenerate_id(TRUE);
        $_SESSION['username'] = $row['username'];
        header('Location: http://127.0.0.1/login.php');
    
[/code]

のようにレコードを取り出せたらsession_regenerate_id(TRUE);を宣言してセッション変数に取り出したユーザー名を入れてlogin.phpに飛ばすという大雑把な流れなんですが、ここら辺に問題があるのでしょうか？


CC BY-SA 3.0
2016-04-24T10:17:07.203
24304
2016-06-15T18:35:20.700
2016-06-15T18:35:20.700
10492
15284
question
php security
session_regenerate_id()の必要性に関して


ご認識はおそらく正しく、実装が間違っているような気がします。  
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がなければ新たに発行する

という動作を行います。「ログイン時に（新たに）セッションを発行する」ということはできないのです。


CC BY-SA 3.0
2016-04-25T02:17:08.643
24321
2016-04-26T11:22:23.857
2016-04-26T11:22:23.857
781
781
24304
answer