回答編集履歴

4

追記

2016/07/10 17:06

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -76,6 +76,10 @@
76
76
 
77
77
  現在メモリ上に展開している`$_SESSION`やセッションファイルには影響を与えない.
78
78
 
79
+ 実際には,次にクライアントはPHPSESSID無しでアクセスしてくるため,新しいセッションが形成される.
80
+
81
+ これだけを行った場合,古いセッションのデータは破棄されずにガベージコレクションが発生するまで残留してしまう.
82
+
79
83
 
80
84
 
81
85
  ###### `$_SESSION = [];`
@@ -85,6 +89,8 @@
85
89
  現在メモリ上に展開している`$_SESSION`のみ空にする.
86
90
 
87
91
  クライアント側のCookieやセッションファイルには影響を与えない.
92
+
93
+ 実際には,`session_write_close();`のタイミングでセッションファイルが空にされる.
88
94
 
89
95
 
90
96
 

3

訂正

2016/07/10 17:06

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  PHP5.5.4以降で`session.use_strict_mode`が有効な場合
56
56
 
57
- → 自動的に`session_regenerate_id();` 相当の処理が行われる.
57
+ → 自動的に`session_regenerate_id();` 相当の処理が行われたあと,`$_SESSION`が利用可能になる.
58
58
 
59
59
 
60
60
 

2

訂正

2016/07/10 16:54

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,64 +1,100 @@
1
- > session_start();でセッションを開始した時に、
2
-
3
- クライアント側のクッキー(デフォだと$_COOKIE['PHPSESSID'])がなければセッションIDを与え、
4
-
5
- サーバーには同セッションIDセッションファイル作成される思います
1
+ グダグダ回答書いていたですもっ簡潔にとめま
6
2
 
7
3
 
8
4
 
9
- ですね.
5
+ ###### 初回の`session_start();`
10
6
 
11
7
 
12
8
 
13
- > その後、session_regenerate_id(true);でセッションIDを振り直すと、
9
+ セッションIDが生成される.
14
10
 
15
- クライアント側にセッションIDは残ったままになりますが、
11
+ `$_SESSION`が利用可能になる.
16
12
 
17
- サーバーのセッションファイルは削除さます。
13
+ `Set-Cookie: PHPSESSID=xxx`というCookieが送らる.
18
14
 
19
15
 
20
16
 
21
- `session_generate_id()`を実行すると,初めて`session_start()`したときと同じようにPHPSESSIDに関するSet-Cookieヘッダが送られます.**クライアント側はこれでCookieを上書きします.**`session_regenerate_id()`の第1引数をtrueにしていれば古いセッションファイルは削除されるので,このタイミングで古いセッションに関する情報はクライアント側・サーバ側ともすべて破棄されることになります.
17
+ ###### `session_write_close();`
22
18
 
23
19
 
24
20
 
25
- > 次に、session_id();で(セッションがある場合)現在のセッョンIDを取得できまが、
21
+ `$_SESSION`をセッションファイルにリアライズして保存る.
26
22
 
27
- 現在セッションというのは何参照てきているのでしょうか?
23
+ `$_SESSION`機能停止する. **ただ,実行す値は残る.**
28
24
 
29
- セッションファイルが無くても、デストロイしていなければ、session_id();をコールすると、
30
-
31
- 最後付与したセッションIDが表示さます。
25
+ **この処理は明示的行わなくても終了時に勝手に行わる.**
32
26
 
33
27
 
34
28
 
35
- セッションファイルは2回目以降の引継ぎのために作成されるだけで,初回時には`$_SESSION`という配列として存在しているだけですね.**メモリ上にPHPの変数として存在しているだけであり,ファイルには記録されていません.**2回目以降はPHPSESSIDを元に該当するファイルのデータを読み取って`$_SESSION`に展開します.
29
+ ###### 2回目以降の`session_start();`
36
30
 
37
31
 
38
32
 
39
- > 例えば、セッションファイルを故意に削除したとして、
33
+ `$_COOKIE['PHPSESSID']`を元にセッションファイルを特定する.
40
34
 
41
- 認証で、session_id();で取得したセッションIDと、クッキーに保存したセッションIDが一致するかを
42
-
43
- チェックするとします。そうした場合、セッョンファルがなくも認証は通のでしょうか?
35
+ リアラズし`$_SESSION`に復元す
44
36
 
45
37
 
46
38
 
47
- php.iniの設定次第です.PHP5.5.4以降では`session.use_strict_mode`というディレクティブをONにしておけば,拒否するようになります.これをしないと通ってしまいますが,`session_generate_id()`を第1引数trueで行う場合,この設定は必ずしも必要ではありません.
39
+ ###### `session_regenerate_id();`
48
-
49
- (備考: [PHP5.5.2以降のstrict sessionsモードでセッションフィクセイション対策はどうすればよいか](http://blog.tokumaru.org/2013/08/session-fixation-prevention-on-strict-sessions.html))
50
40
 
51
41
 
52
42
 
53
- > また、$_SESSION['hoge']などに値を入ていたとして、echoす場合、
43
+ セッションIDが再生成される
54
44
 
55
- もsession_id();に一致するセッションファイルに書いてあ値を表示させているのでしょうか?
45
+ 第1引数にtrueを渡していば,古いセッションファイルの削除が行われ
56
46
 
57
- 例えばsession_id();にIDが入ってて、セッショファイルが無い場合どうなのでしょうか?
47
+ `Set-Cookie: PHPSESSID=xxx`というCookie送られる.**古Cookieはクライアト側で上書きされ.**
58
48
 
59
49
 
60
50
 
61
- 同一プロセス内にて`$_SESSION`に値を格納したのであれば,その値がそのまま表示されだけです.**セッションファイル記録はプロセス消滅時,セッションファイルからの復元はプロセス生成時に行われます.**
51
+ ###### 対応するセッションファイルが無いPHPSESSIDを送ってきたとき`session_start();`
52
+
53
+
54
+
55
+ PHP5.5.4以降で`session.use_strict_mode`が有効な場合
56
+
57
+ → 自動的に`session_regenerate_id();` 相当の処理が行われる.
58
+
59
+
60
+
61
+ それ以外の場合
62
+
63
+ → `$_SESSION`が利用可能になる.
64
+
65
+
66
+
67
+ 備考: [PHP5.5.2以降のstrict sessionsモードでセッションフィクセイション対策はどうすればよいか](http://blog.tokumaru.org/2013/08/session-fixation-prevention-on-strict-sessions.html)
68
+
69
+
70
+
71
+ ###### `setcookie(session_name(), '', 1);`
72
+
73
+
74
+
75
+ クライアント側のCookieのみ削除要請する.
76
+
77
+ 現在メモリ上に展開している`$_SESSION`やセッションファイルには影響を与えない.
78
+
79
+
80
+
81
+ ###### `$_SESSION = [];`
82
+
83
+
84
+
85
+ 現在メモリ上に展開している`$_SESSION`のみ空にする.
86
+
87
+ クライアント側のCookieやセッションファイルには影響を与えない.
88
+
89
+
90
+
91
+ ###### `session_destroy();`
92
+
93
+
94
+
95
+ セッションファイルを削除し, `$_SESSION`の機能を停止する.
96
+
97
+ クライアント側のCookieや現在メモリ上に展開している`$_SESSION`には影響を与えない.
62
98
 
63
99
 
64
100
 

1

強調

2016/07/10 16:52

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
 
21
- `session_generate_id()`を実行すると,初めて`session_start()`したときと同じようにPHPSESSIDに関するSet-Cookieヘッダが送られます.クライアント側はこれでCookieを上書きします.`session_regenerate_id()`の第1引数をtrueにしていれば古いセッションファイルは削除されるので,このタイミングで古いセッションに関する情報はクライアント側・サーバ側ともすべて破棄されることになります.
21
+ `session_generate_id()`を実行すると,初めて`session_start()`したときと同じようにPHPSESSIDに関するSet-Cookieヘッダが送られます.**クライアント側はこれでCookieを上書きします.**`session_regenerate_id()`の第1引数をtrueにしていれば古いセッションファイルは削除されるので,このタイミングで古いセッションに関する情報はクライアント側・サーバ側ともすべて破棄されることになります.
22
22
 
23
23
 
24
24
 
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- セッションファイルは2回目以降の引継ぎのために作成されるだけで,初回時には`$_SESSION`という配列として存在しているだけですね.メモリ上に存在しているだけであり,ファイルには記録されていません.2回目以降はPHPSESSIDを元に該当するファイルのデータを読み取って`$_SESSION`に展開します.
35
+ セッションファイルは2回目以降の引継ぎのために作成されるだけで,初回時には`$_SESSION`という配列として存在しているだけですね.**メモリ上にPHPの変数として存在しているだけであり,ファイルには記録されていません.**2回目以降はPHPSESSIDを元に該当するファイルのデータを読み取って`$_SESSION`に展開します.
36
36
 
37
37
 
38
38
 
@@ -58,7 +58,7 @@
58
58
 
59
59
 
60
60
 
61
- 同一プロセス内にて`$_SESSION`に値を格納したのであれば,その値がそのまま表示されるだけです.セッションファイルへの記録はプロセス消滅時,セッションファイルからの復元はプロセス生成時に行われます.
61
+ 同一プロセス内にて`$_SESSION`に値を格納したのであれば,その値がそのまま表示されるだけです.**セッションファイルへの記録はプロセス消滅時,セッションファイルからの復元はプロセス生成時に行われます.**
62
62
 
63
63
 
64
64