• お世話になります。
    session_regenerate_id関数につい...
  • riccaricca 
    お世話になります。session_regenerate_id関数について質問させてください。

    ・session_regenerate_id()の動きを確認していたところ、関数を実行したタイミングでサーバ上に新しいセッションファイルが作成され、ブラウザのセッションIDの値も自動で書き換えられました。
    しかし、サーバ上の古いセッションIDのファイルは削除されずに残ってしまうようです。(ファイルの中身も削除されず残ったままとなります。)
    インターネットで調べたところ、session_regenerate_idの引数にtrueを付けると、古いセッションIDのファイルも削除されるとわかりました。

    session_regenerate_id(true)の方がよりセキュリティが高まるのではないかと思いますので、今後引数にtrueをつけようと考えていますが、実際にアプリを作る上でtrueを指定するのは非推奨という事はありますでしょうか?
    ※trueを付けた場合、セッションが切れてしまう事象があると記事を見つけましたので・・
     https://senews.jp/session-kireru/


    また、本レッスン動画の最後のまとめのページに書かれている「4.session_unset()はセッションIDまで消す関数」は、session_unset()ではなくsession_destroy()ではないかと思われますので、ご確認頂ければと思います。


    以上です。
    お手数をおかけしますが、よろしくお願いいたします。
    回答 1

     
    >実際にアプリを作る上でtrueを指定するのは非推奨という事はありますでしょうか?

    これはPHPの動作の推奨を知りたいということですので、PHPの公式ドキュメントを見ましょう。
    http://php.net/manual/ja/function.session-regenerate-id.php

    赤ワクで以下のような警告があります。
    「Current session_regenerate_id does not handle unstable network well. e.g. Mobile and WiFi network. Therefore, you may experience lost session by calling session_regenerate_id.
    You should not destroy old session data immediately, but should use destroy time-stamp and control access to old session ID. Otherwise, concurrent access to page may result in inconsistent state, or you may have lost session, or it may cause client(browser) side race condition and may create many session ID needlessly. Immediate session data deletion disables session hijack attack detection and prevention also.」

    意訳すると、session_regenerate_idは不安定なネットワークだと上手く動作しない。古いセッションをすぐに消すべきではない。タイムスタンプ等を使って、時限的に消去されるようにするべきだ。ということです。

    一般的にsessionは有効期限が設定されているので、アプリ側で明示的に削除することはあまりしません。
    ただ、これもサービスのポリシーによっては異なるので一概には言えません。

    返信者画像

    ウェブカツ!!コーチ 
    講師からの回答
    >また、本レッスン動画の最後のまとめのページに書かれている「4.session_unset()はセッションIDまで消す関数」は、session_unset()ではなくsession_destroy()ではないかと思われますので、ご確認頂ければと思います。

    riccaさん、お気づきいただきありがとうございます。
    補足に追記をさせていただきました。

    ricca 
    ご回答ありがとうございます。
    PHPの公式ページの方も確認させていただきました。

    sessionはアプリ側で明示的には削除しない事が多いのですね。勉強になりました。

    session_regerate_id()の実行を行った場合、
    セッション変数の値が書き込まれた古いセッションファイルが
    サーバに残ったままとなりますので
    セッションハイジャックの危険性が高まるのではないかと考えましたが、
    セキュリティは奥が深そうですので
    この辺りの詳細な学習は後回しにしてひとまず先に進もうと思います。


    補足の方もご対応ありがとうございます。
    また何かありましたら質問等させていただきますので、引き続きよろしくお願いいたします。