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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

9918閲覧

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

smnsmn

総合スコア175

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

3グッド

7クリップ

投稿2016/07/10 13:11

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

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();のセッションファイルがあるかどうかを確認するという作業も要るのか・・・?
(そんなの調べても誰も書いてなかったですが)
と思ったのですが、不要でしょうか。
セッション変数、クッキーとセッションファイルの連携が理解しきれませんでした。

mpyw, zico_teratail, ikuwow👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

初回の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/10 16:23

編集2016/07/10 17:06
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2016/07/10 16:55 編集

一番ネックなのは,私たちが変数 $_SESSION を取り回しているときには,セッションファイルそのものを触っているわけではないことです.「セッションファイル」と「$_SESSION」は同期されるタイミングが決まっています.
smnsmn

2016/07/10 17:16 編集

詳しい解説ありがとうございますm(__)m mpyw様のQiitaの記事も幾つか拝見させていただいておりました・・・! とても勉強になります。 <長々書いてしまったので以下に書いていたコメントは一旦下げます>
smnsmn

2016/07/10 17:08

追記ありがとうございますm(__)m >私たちが変数 $_SESSION を取り回しているときには,セッションファイルそのものを触っているわけではないことです.「セッションファイル」と「$_SESSION」は同期されるタイミングが決まっています つまり、$_SESSIONの中身を確認しながら行っていても、 セッションファイルと同期されなければ上手く認証ができないということでしょうか・・・ 上手く認証ができず、困り果てています。;;;
smnsmn

2016/07/10 17:10

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

2016/07/11 06:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問