回答編集履歴
4
追記
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
訂正
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
訂正
test
CHANGED
@@ -1,64 +1,100 @@
|
|
1
|
-
> session_start();でセッションを開始した時に、
|
2
|
-
|
3
|
-
クライアント側のクッキー(デフォだと$_COOKIE['PHPSESSID'])がなければセッションIDを与え、
|
4
|
-
|
5
|
-
|
1
|
+
グダグダ回答書いていたのですがもっと簡潔にまとめます.
|
6
2
|
|
7
3
|
|
8
4
|
|
9
|
-
|
5
|
+
###### 初回の`session_start();`
|
10
6
|
|
11
7
|
|
12
8
|
|
13
|
-
|
9
|
+
セッションIDが生成される.
|
14
10
|
|
15
|
-
|
11
|
+
`$_SESSION`が利用可能になる.
|
16
12
|
|
17
|
-
|
13
|
+
`Set-Cookie: PHPSESSID=xxx`というCookieが送られる.
|
18
14
|
|
19
15
|
|
20
16
|
|
21
|
-
`session_
|
17
|
+
###### `session_write_close();`
|
22
18
|
|
23
19
|
|
24
20
|
|
25
|
-
|
21
|
+
`$_SESSION`をセッションファイルにシリアライズして保存する.
|
26
22
|
|
27
|
-
|
23
|
+
`$_SESSION`の機能を停止する. **ただし,実行する前の値は残る.**
|
28
24
|
|
29
|
-
セッションファイルが無くても、デストロイしていなければ、session_id();をコールすると、
|
30
|
-
|
31
|
-
|
25
|
+
**この処理は明示的に行わなくても終了時に勝手に行われる.**
|
32
26
|
|
33
27
|
|
34
28
|
|
35
|
-
|
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
|
-
|
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
|
-
|
43
|
+
セッションIDが再生成される.
|
54
44
|
|
55
|
-
|
45
|
+
第1引数にtrueを渡していれば,古いセッションファイルの削除が行われる.
|
56
46
|
|
57
|
-
|
47
|
+
`Set-Cookie: PHPSESSID=xxx`というCookieが送られる.**古いCookieはクライアント側で上書きされる.**
|
58
48
|
|
59
49
|
|
60
50
|
|
61
|
-
|
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
強調
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
|
|