回答編集履歴

1

追記

2017/04/19 08:58

投稿

shi_ue
shi_ue

スコア4437

test CHANGED
@@ -5,3 +5,191 @@
5
5
 
6
6
 
7
7
  ところで、なぜ別ウィンドウを開くときにログインしていない方がいいんでしょうか?
8
+
9
+
10
+
11
+ 追記
12
+
13
+ ---
14
+
15
+ 別ウィンドウで開くとマズいセキュリティ対策、っていうのがかなり気になりますが・・・
16
+
17
+ 銀行並みですね。
18
+
19
+
20
+
21
+ トークンを使って、必ずその画面遷移を通らないとログイン画面に飛ばす、という方法があります。
22
+
23
+ そのページを出力する際に、セッション上にトークンを保存し、ページにもトークンを書き出し、遷移先でトークを比較するわけです。
24
+
25
+
26
+
27
+ 以下の例では、page1は何のチェックもしていないのでどこからでも飛んで来れますが、その他のページは必ずリンクを辿らないと表示されません。(リロードも許されません)
28
+
29
+
30
+
31
+ page1
32
+
33
+ ```php
34
+
35
+ <?php
36
+
37
+ session_start();
38
+
39
+ session_regenerate_id(true);
40
+
41
+
42
+
43
+ $token = md5(uniqid('', true));
44
+
45
+ $_SESSION['token'] = $token;
46
+
47
+
48
+
49
+ ?>
50
+
51
+ <!DOCTYPE html>
52
+
53
+ <html>
54
+
55
+ <head>
56
+
57
+ <meta charset="utf-8">
58
+
59
+ </head>
60
+
61
+
62
+
63
+ <body>
64
+
65
+ <h1>page 1</h1>
66
+
67
+ <a href="page2.php?t=<?= $token ?>">Go to page2</a>
68
+
69
+ <a href="page3.php?t=<?= $token ?>">Go to page3</a>
70
+
71
+ </body>
72
+
73
+ </html>
74
+
75
+ ```
76
+
77
+
78
+
79
+ page2
80
+
81
+ ```php
82
+
83
+ <?php
84
+
85
+ session_start();
86
+
87
+ session_regenerate_id(true);
88
+
89
+
90
+
91
+ if (!isset($_GET['t']) || $_SESSION['token'] != $_GET['t']){
92
+
93
+ header('Content-type: text/plain; charset=utf-8');
94
+
95
+ echo "不正な遷移です";
96
+
97
+ exit;
98
+
99
+ }
100
+
101
+ $token = md5(uniqid('', true));
102
+
103
+ $_SESSION['token'] = $token;
104
+
105
+
106
+
107
+ ?>
108
+
109
+ <!DOCTYPE html>
110
+
111
+ <html>
112
+
113
+ <head>
114
+
115
+ <meta charset="utf-8">
116
+
117
+ </head>
118
+
119
+
120
+
121
+ <body>
122
+
123
+ <h1>page 2</h1>
124
+
125
+ <a href="page1.php">Go to page1</a>
126
+
127
+ <a href="page3.php?t=<?= $token ?>">Go to page3</a>
128
+
129
+ </body>
130
+
131
+ </html>
132
+
133
+ ```
134
+
135
+
136
+
137
+ page3
138
+
139
+ ```php
140
+
141
+ <?php
142
+
143
+ session_start();
144
+
145
+ session_regenerate_id(true);
146
+
147
+
148
+
149
+ if (!isset($_GET['t']) || $_SESSION['token'] != $_GET['t']){
150
+
151
+ header('Content-type: text/plain; charset=utf-8');
152
+
153
+ echo "不正な遷移です";
154
+
155
+ exit;
156
+
157
+ }
158
+
159
+ $token = md5(uniqid('', true));
160
+
161
+ $_SESSION['token'] = $token;
162
+
163
+
164
+
165
+ ?>
166
+
167
+ <!DOCTYPE html>
168
+
169
+ <html>
170
+
171
+ <head>
172
+
173
+ <meta charset="utf-8">
174
+
175
+ </head>
176
+
177
+
178
+
179
+ <body>
180
+
181
+ <h1>page 3</h1>
182
+
183
+ <a href="page1.php">Go to page1</a>
184
+
185
+ <a href="page2.php?t=<?= $token ?>">Go to page2</a>
186
+
187
+ </body>
188
+
189
+ </html>
190
+
191
+ ```
192
+
193
+
194
+
195
+ 果たしてこんなことが使う人が望むことなのかどうかは分かりませんが・・・