質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

session_id()と$_SESSIONの値はセッションファイルを参照しているのでしょうか?

解決済

回答 1

投稿

  • 評価
  • クリップ 7
  • VIEW 7,667

score 173

セッションの挙動について教えて下さい。

session_start();でセッションを開始した時に、
クライアント側のクッキー(デフォだと$_COOKIE['PHPSESSID'])がなければセッションIDを与え、
サーバーには同セッションIDのセッションファイルが作成されると思います。

その後、session_regenerate_id(true);でセッションIDを振り直すと、
クライアント側にセッションIDは残ったままになりますが、
サーバーのセッションファイルは削除されます。

・・・ここまでまず、あっているでしょうか?


次に、session_id();で(セッションがある場合)現在のセッションIDを取得できますが、
現在のセッションというのは何を参照してきているのでしょうか?
セッションファイルが無くても、デストロイしていなければ、session_id();をコールすると、
最後に付与したセッションIDが表示されます。

例えば、セッションファイルを故意に削除したとして、
認証で、session_id();で取得したセッションIDと、クッキーに保存したセッションIDが一致するかを
チェックするとします。

そうした場合、セッションファイルがなくても認証は通るのでしょうか?


また、$_SESSION['hoge']などに値を入れていたとして、echoする場合、
これもsession_id();に一致するセッションファイルに書いてある値を表示させているのでしょうか?
例えばsession_id();にIDが入っていて、セッションファイルが無い場合どうなるのでしょうか?

テストしているとよく分からなくなってきました。
何卒、ご教授頂けますと幸いです。

補足
セッションの認証で、session_id();とクッキーのセッションIDが一致するか。
また、セッション変数に入っている値が一致するか。
という認証を行おうと思っているのですが、
取得したsession_id();のセッションファイルがあるかどうかを確認するという作業も要るのか・・・?
(そんなの調べても誰も書いてなかったですが)
と思ったのですが、不要でしょうか。
セッション変数、クッキーとセッションファイルの連携が理解しきれませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

グダグダ回答書いていたのですがもっと簡潔にまとめます.

 初回のsession_start();

セッションIDが生成される.
$_SESSIONが利用可能になる.
Set-Cookie: PHPSESSID=xxxというCookieが送られる.

 session_write_close();

$_SESSIONをセッションファイルにシリアライズして保存する.
$_SESSIONの機能を停止する. ただし,実行する前の値は残る.
この処理は明示的に行わなくても終了時に勝手に行われる.

 2回目以降のsession_start();

$_COOKIE['PHPSESSID']を元にセッションファイルを特定する.
デシリアライズして$_SESSIONに復元する.

 session_regenerate_id();

セッションIDが再生成される.
第1引数にtrueを渡していれば,古いセッションファイルの削除が行われる.
Set-Cookie: PHPSESSID=xxxというCookieが送られる.古いCookieはクライアント側で上書きされる.

 対応するセッションファイルが無いPHPSESSIDを送ってきたときのsession_start();

PHP5.5.4以降でsession.use_strict_modeが有効な場合
→ 自動的にsession_regenerate_id(); 相当の処理が行われたあと,$_SESSIONが利用可能になる.

それ以外の場合
→ $_SESSIONが利用可能になる.

備考: PHP5.5.2以降のstrict sessionsモードでセッションフィクセイション対策はどうすればよいか

 setcookie(session_name(), '', 1);

クライアント側のCookieのみ削除要請する.
現在メモリ上に展開している$_SESSIONやセッションファイルには影響を与えない.
実際には,次にクライアントはPHPSESSID無しでアクセスしてくるため,新しいセッションが形成される.
これだけを行った場合,古いセッションのデータは破棄されずにガベージコレクションが発生するまで残留してしまう.

 $_SESSION = [];

現在メモリ上に展開している$_SESSIONのみ空にする.
クライアント側のCookieやセッションファイルには影響を与えない.
実際には,session_write_close();のタイミングでセッションファイルが空にされる.

 session_destroy();

セッションファイルを削除し, $_SESSIONの機能を停止する.
クライアント側のCookieや現在メモリ上に展開している$_SESSIONには影響を与えない.

【備考】
http://qiita.com/mpyw/items/b2a2b0e8e60ed4680f06#%E3%83%A6%E3%83%BC%E3%82%B6%E8%AA%8D%E8%A8%BC%E3%81%8A%E3%82%88%E3%81%B3%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/11 02:08

    追記ありがとうございますm(__)m
    >私たちが変数 $_SESSION を取り回しているときには,セッションファイルそのものを触っているわけではないことです.「セッションファイル」と「$_SESSION」は同期されるタイミングが決まっています

    つまり、$_SESSIONの中身を確認しながら行っていても、
    セッションファイルと同期されなければ上手く認証ができないということでしょうか・・・
    上手く認証ができず、困り果てています。;;;

    キャンセル

  • 2016/07/11 02:10

    長い返信を書いている間に、編集してくださっておりました。
    理解の薄いコメントを送信してすみません、一旦、編集くださった解説を読みなおします。

    キャンセル

  • 2016/07/11 15:26

    丁寧に解説頂きありがとうございました。
    疑問が解決致しました。セッション変数や、取得するセッションIDで処理を行っていましたが、
    セッションファイルへの書き込みのタイミング、
    ファイルが無い時の動き、各削除・リセットはどこに影響し、影響しないのかとても理解が深まりました。
    調べても、ここまで書いているものはなく、本当に勉強になりました。
    ありがとうございましたm(__)m

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る