質問編集履歴

3

修正

2017/12/06 00:21

投稿

dog57
dog57

スコア131

test CHANGED
File without changes
test CHANGED
@@ -184,6 +184,250 @@
184
184
 
185
185
 
186
186
 
187
+ login_check.php (チェック) html省略
188
+
189
+ ```php
190
+
191
+ <?php
192
+
193
+ // 開発時にこれを書かないのはNG
194
+
195
+ ini_set('display_errors', true);
196
+
197
+ error_reporting(E_ALL);
198
+
199
+
200
+
201
+ session_start();
202
+
203
+ header("Content-type: text/html; charset=utf-8");
204
+
205
+
206
+
207
+ // クロスサイトリクエストフォージュリ(CSRF)対策のトークン判定
208
+
209
+ if ($_POST["token"] != $_SESSION["token"]) {
210
+
211
+ echo "不正アクセスの可能性あり。";
212
+
213
+ exit();
214
+
215
+ }
216
+
217
+
218
+
219
+ // クリックジャッキング対策
220
+
221
+ header("X-FRAME-OPTIONS: SAMEORIGIN");
222
+
223
+
224
+
225
+ // 変数の初期化
226
+
227
+ $email = '';
228
+
229
+
230
+
231
+ // セッション変数の定義
232
+
233
+
234
+
235
+ // エラーメッセージの配列の初期化
236
+
237
+ $errors = array();
238
+
239
+ // セッション変数の初期化
240
+
241
+ $_SESSION['errors'] = array();
242
+
243
+
244
+
245
+ // データベース接続
246
+
247
+ require_once(__DIR__. '/db.php');
248
+
249
+
250
+
251
+ // 前後にある半角全角スペースを削除する関数
252
+
253
+ function spaceTrim($str) {
254
+
255
+
256
+
257
+ // 行頭
258
+
259
+ $str = preg_replace('/^[ ]+/u', '', $str);
260
+
261
+ // 末尾
262
+
263
+ $str = preg_replace('/[ ]+$/u', '', $str);
264
+
265
+
266
+
267
+ return $str;
268
+
269
+ }
270
+
271
+
272
+
273
+ // エラーメッセージの初期化
274
+
275
+ $errors = array();
276
+
277
+
278
+
279
+ // POST時
280
+
281
+ if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == "POST") {
282
+
283
+
284
+
285
+ // POSTされたデータを各変数に入れる
286
+
287
+ $username = filter_input(INPUT_POST, 'username');
288
+
289
+ $password = filter_input(INPUT_POST, 'password');
290
+
291
+
292
+
293
+ // 前後にある半角全角スペースを削除
294
+
295
+ $username = spaceTrim($username);
296
+
297
+ $password = spaceTrim($password);
298
+
299
+
300
+
301
+ // アカウント入力判定
302
+
303
+ if (empty($_SESSION["username"])) {
304
+
305
+ $errors[] = "usernameもしくは、emailが入力されていません。";
306
+
307
+ }
308
+
309
+
310
+
311
+ // パスワード入力判定
312
+
313
+ if (empty($_SESSION["password"])) {
314
+
315
+ $errors[] = "パスワードが入力されていません。";
316
+
317
+ } elseif (preg_match('/^[0-9a-zA-Z]{1,7}$/', $password)) {
318
+
319
+ $errors[] = "パスワードは8文字以上で入力してください。";
320
+
321
+ } else {
322
+
323
+ $password_hide = str_repeat('*', strlen($password));
324
+
325
+ }
326
+
327
+ }
328
+
329
+
330
+
331
+ // エラーがなければ実行する
332
+
333
+ if (count($errors) == 0) {
334
+
335
+ try {
336
+
337
+ // 例外処理を投げる(スロー)ようにする
338
+
339
+ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
340
+
341
+
342
+
343
+ // アカウントで検索
344
+
345
+ $statement = $dbh->prepare("SELECT * FROM users WHERE email=(:email)");
346
+
347
+ $statement->bindValue(":email", $email, PDO::PARAM_STR);
348
+
349
+ $statement->execute();
350
+
351
+
352
+
353
+ // アカウントが一致
354
+
355
+ if ($row = $statement->fetch()) {
356
+
357
+ $db_password = $row["password"];
358
+
359
+
360
+
361
+ // パスワードが一致
362
+
363
+ if ($password === $db_password) {
364
+
365
+
366
+
367
+ // セッションハイジャック対策
368
+
369
+ session_regenerate_id(true);
370
+
371
+
372
+
373
+ $_SESSION["username"] = $username;
374
+
375
+ header("Location: login_admin.php");
376
+
377
+ exit();
378
+
379
+ } else {
380
+
381
+ $errors[] = "アカウント及びパスワードが一致しません。";
382
+
383
+ }
384
+
385
+ } else {
386
+
387
+ $errors[] = "アカウント及びパスワードが一致しません。";
388
+
389
+ }
390
+
391
+
392
+
393
+ if (count($errors) > 0) {
394
+
395
+ $errors = $_SESSION["errors"];
396
+
397
+ foreach ($errors as $value) {
398
+
399
+ echo $error;
400
+
401
+ }
402
+
403
+ header("Location: login_form.php");
404
+
405
+ }
406
+
407
+
408
+
409
+ // データベース切断
410
+
411
+ $dbh = null;
412
+
413
+ } catch (PDOException $e) {
414
+
415
+ print("Error:" .$e->getMessage());
416
+
417
+ die();
418
+
419
+ }
420
+
421
+ }
422
+
423
+
424
+
425
+ ?>
426
+
427
+ ```
428
+
429
+
430
+
187
431
  遷移先 login_admin.php
188
432
 
189
433
  ```php
@@ -265,247 +509,3 @@
265
509
 
266
510
 
267
511
  ```
268
-
269
-
270
-
271
- login_check.php (チェック) html省略
272
-
273
- ```php
274
-
275
- <?php
276
-
277
- // 開発時にこれを書かないのはNG
278
-
279
- ini_set('display_errors', true);
280
-
281
- error_reporting(E_ALL);
282
-
283
-
284
-
285
- session_start();
286
-
287
- header("Content-type: text/html; charset=utf-8");
288
-
289
-
290
-
291
- // クロスサイトリクエストフォージュリ(CSRF)対策のトークン判定
292
-
293
- if ($_POST["token"] != $_SESSION["token"]) {
294
-
295
- echo "不正アクセスの可能性あり。";
296
-
297
- exit();
298
-
299
- }
300
-
301
-
302
-
303
- // クリックジャッキング対策
304
-
305
- header("X-FRAME-OPTIONS: SAMEORIGIN");
306
-
307
-
308
-
309
- // 変数の初期化
310
-
311
- $email = '';
312
-
313
-
314
-
315
- // セッション変数の定義
316
-
317
-
318
-
319
- // エラーメッセージの配列の初期化
320
-
321
- $errors = array();
322
-
323
- // セッション変数の初期化
324
-
325
- $_SESSION['errors'] = array();
326
-
327
-
328
-
329
- // データベース接続
330
-
331
- require_once(__DIR__. '/db.php');
332
-
333
-
334
-
335
- // 前後にある半角全角スペースを削除する関数
336
-
337
- function spaceTrim($str) {
338
-
339
-
340
-
341
- // 行頭
342
-
343
- $str = preg_replace('/^[ ]+/u', '', $str);
344
-
345
- // 末尾
346
-
347
- $str = preg_replace('/[ ]+$/u', '', $str);
348
-
349
-
350
-
351
- return $str;
352
-
353
- }
354
-
355
-
356
-
357
- // エラーメッセージの初期化
358
-
359
- $errors = array();
360
-
361
-
362
-
363
- // POST時
364
-
365
- if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == "POST") {
366
-
367
-
368
-
369
- // POSTされたデータを各変数に入れる
370
-
371
- $username = filter_input(INPUT_POST, 'username');
372
-
373
- $password = filter_input(INPUT_POST, 'password');
374
-
375
-
376
-
377
- // 前後にある半角全角スペースを削除
378
-
379
- $username = spaceTrim($username);
380
-
381
- $password = spaceTrim($password);
382
-
383
-
384
-
385
- // アカウント入力判定
386
-
387
- if (empty($_SESSION["username"])) {
388
-
389
- $errors[] = "usernameもしくは、emailが入力されていません。";
390
-
391
- }
392
-
393
-
394
-
395
- // パスワード入力判定
396
-
397
- if (empty($_SESSION["password"])) {
398
-
399
- $errors[] = "パスワードが入力されていません。";
400
-
401
- } elseif (preg_match('/^[0-9a-zA-Z]{1,7}$/', $password)) {
402
-
403
- $errors[] = "パスワードは8文字以上で入力してください。";
404
-
405
- } else {
406
-
407
- $password_hide = str_repeat('*', strlen($password));
408
-
409
- }
410
-
411
- }
412
-
413
-
414
-
415
- // エラーがなければ実行する
416
-
417
- if (count($errors) == 0) {
418
-
419
- try {
420
-
421
- // 例外処理を投げる(スロー)ようにする
422
-
423
- $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
424
-
425
-
426
-
427
- // アカウントで検索
428
-
429
- $statement = $dbh->prepare("SELECT * FROM users WHERE email=(:email)");
430
-
431
- $statement->bindValue(":email", $email, PDO::PARAM_STR);
432
-
433
- $statement->execute();
434
-
435
-
436
-
437
- // アカウントが一致
438
-
439
- if ($row = $statement->fetch()) {
440
-
441
- $db_password = $row["password"];
442
-
443
-
444
-
445
- // パスワードが一致
446
-
447
- if ($password === $db_password) {
448
-
449
-
450
-
451
- // セッションハイジャック対策
452
-
453
- session_regenerate_id(true);
454
-
455
-
456
-
457
- $_SESSION["username"] = $username;
458
-
459
- header("Location: login_admin.php");
460
-
461
- exit();
462
-
463
- } else {
464
-
465
- $errors[] = "アカウント及びパスワードが一致しません。";
466
-
467
- }
468
-
469
- } else {
470
-
471
- $errors[] = "アカウント及びパスワードが一致しません。";
472
-
473
- }
474
-
475
-
476
-
477
- if (count($errors) > 0) {
478
-
479
- $errors = $_SESSION["errors"];
480
-
481
- foreach ($errors as $value) {
482
-
483
- echo $error;
484
-
485
- }
486
-
487
- header("Location: login_form.php");
488
-
489
- }
490
-
491
-
492
-
493
- // データベース切断
494
-
495
- $dbh = null;
496
-
497
- } catch (PDOException $e) {
498
-
499
- print("Error:" .$e->getMessage());
500
-
501
- die();
502
-
503
- }
504
-
505
- }
506
-
507
-
508
-
509
- ?>
510
-
511
- ```

2

login_check.php (チェック) の追記

2017/12/06 00:21

投稿

dog57
dog57

スコア131

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- login_form.php (画像の画面)
19
+ login_form.php (画像の画面) htmlは一部抜粋
20
20
 
21
21
  ```php
22
22
 
@@ -60,359 +60,207 @@
60
60
 
61
61
 
62
62
 
63
+ <!-- パンくずリスト-->
64
+
65
+ <ol class="breadcrumb">
66
+
67
+ <li><a href="http://192.168.33.15"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li>
68
+
69
+ <li class="active">ログインフォーム</li>
70
+
71
+ </ol>
72
+
73
+
74
+
75
+
76
+
77
+ <div class="container">
78
+
79
+
80
+
81
+ <?php if (count($errors) > 0): ?>
82
+
83
+ <?php foreach ((array)$errors as $value): ?>
84
+
85
+ <?php echo "<font color=RED>".$value."</font>"."<br>" ?>
86
+
87
+ <?php endforeach; ?>
88
+
89
+ <?php endif; ?>
90
+
91
+
92
+
93
+ <div id="loginbox" style="margin-top:50px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
94
+
95
+ <div class="panel panel-info" >
96
+
97
+ <div class="panel-heading">
98
+
99
+ <div class="panel-title">Sign In</div>
100
+
101
+ <div style="float:right; font-size: 80%; position: relative; top:-10px"><a href="#">Forgot password?</a></div>
102
+
103
+ </div>
104
+
105
+
106
+
107
+ <div style="padding-top:30px" class="panel-body" >
108
+
109
+
110
+
111
+ <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div>
112
+
113
+
114
+
115
+ <form id="loginform" class="form-horizontal" role="form" method="post" action="login_admin.php">
116
+
117
+
118
+
119
+ <div style="margin-bottom: 25px" class="input-group">
120
+
121
+ <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
122
+
123
+ <input id="login-username" type="text" class="form-control" name="username" value="" placeholder="username or email">
124
+
125
+ </div>
126
+
127
+
128
+
129
+ <div style="margin-bottom: 25px" class="input-group">
130
+
131
+ <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
132
+
133
+ <input id="login-password" type="password" class="form-control" name="password" placeholder="password">
134
+
135
+ </div>
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+ <div class="input-group">
144
+
145
+ <div class="checkbox">
146
+
147
+ <label>
148
+
149
+ <input id="login-remember" type="checkbox" name="remember" value="1"> Remember me
150
+
151
+ </label>
152
+
153
+ </div>
154
+
155
+ </div>
156
+
157
+
158
+
159
+
160
+
161
+ <div style="margin-top:10px" class="form-group">
162
+
163
+ <!-- Button -->
164
+
165
+
166
+
167
+ <div class="col-sm-12 controls">
168
+
169
+ <button name="login-button" id="btn-login" class="btn btn-success">Login</button>
170
+
171
+ <a id="btn-fblogin" href="#" class="btn btn-primary">Login with Facebook</a>
172
+
173
+
174
+
175
+ </div>
176
+
177
+ </div>
178
+
179
+
180
+
181
+
182
+
183
+ ```
184
+
185
+
186
+
187
+ 遷移先 login_admin.php
188
+
189
+ ```php
190
+
191
+ <?php
192
+
193
+ // 開発時にこれを書かないのはNG
194
+
195
+ ini_set('display_errors', true);
196
+
197
+ error_reporting(E_ALL);
198
+
199
+
200
+
201
+ session_start();
202
+
203
+ header("Content-type: text/html; charset=utf-8");
204
+
205
+
206
+
207
+ $username = '';
208
+
209
+
210
+
211
+
212
+
213
+ // ログイン状態のチェック
214
+
215
+ if (!isset($_SESSION["username"])) {
216
+
217
+ header("Location: login_form.php");
218
+
219
+ exit();
220
+
221
+ }
222
+
223
+
224
+
225
+ function h($string) {
226
+
227
+ return htmlspecialchars($string, ENT_QUOTES, "UTF-8");
228
+
229
+ }
230
+
231
+
232
+
233
+ ?>
234
+
63
235
 
64
236
 
65
237
  <!DOCTYPE html>
66
238
 
67
239
  <html lang="ja">
68
240
 
69
- <head>
241
+ <head>
70
242
 
71
243
  <meta charset="utf-8">
72
244
 
73
- <title>ログインフォーム</title>
74
-
75
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
76
-
77
- <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen">
78
-
79
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
80
-
81
-
82
-
83
-
84
-
85
- </head>
86
-
87
- <body>
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
- <!-- パンくずリスト-->
96
-
97
- <ol class="breadcrumb">
98
-
99
- <li><a href="http://192.168.33.15"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li>
100
-
101
- <li class="active">ログインフォーム</li>
102
-
103
- </ol>
104
-
105
-
106
-
107
-
108
-
109
- <div class="container">
110
-
111
-
112
-
113
- <?php if (count($errors) > 0): ?>
114
-
115
- <?php foreach ((array)$errors as $value): ?>
116
-
117
- <?php echo "<font color=RED>".$value."</font>"."<br>" ?>
118
-
119
- <?php endforeach; ?>
120
-
121
- <?php endif; ?>
122
-
123
-
124
-
125
- <div id="loginbox" style="margin-top:50px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
126
-
127
- <div class="panel panel-info" >
128
-
129
- <div class="panel-heading">
130
-
131
- <div class="panel-title">Sign In</div>
132
-
133
- <div style="float:right; font-size: 80%; position: relative; top:-10px"><a href="#">Forgot password?</a></div>
134
-
135
- </div>
136
-
137
-
138
-
139
- <div style="padding-top:30px" class="panel-body" >
140
-
141
-
142
-
143
- <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div>
144
-
145
-
146
-
147
- <form id="loginform" class="form-horizontal" role="form" method="post" action="login_admin.php">
148
-
149
-
150
-
151
- <div style="margin-bottom: 25px" class="input-group">
152
-
153
- <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
154
-
155
- <input id="login-username" type="text" class="form-control" name="username" value="" placeholder="username or email">
156
-
157
- </div>
158
-
159
-
160
-
161
- <div style="margin-bottom: 25px" class="input-group">
162
-
163
- <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
164
-
165
- <input id="login-password" type="password" class="form-control" name="password" placeholder="password">
166
-
167
- </div>
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
- <div class="input-group">
176
-
177
- <div class="checkbox">
178
-
179
- <label>
180
-
181
- <input id="login-remember" type="checkbox" name="remember" value="1"> Remember me
182
-
183
- </label>
184
-
185
- </div>
186
-
187
- </div>
188
-
189
-
190
-
191
-
192
-
193
- <div style="margin-top:10px" class="form-group">
194
-
195
- <!-- Button -->
196
-
197
-
198
-
199
- <div class="col-sm-12 controls">
200
-
201
- <button name="login-button" id="btn-login" class="btn btn-success">Login</button>
202
-
203
- <a id="btn-fblogin" href="#" class="btn btn-primary">Login with Facebook</a>
204
-
205
-
206
-
207
- </div>
208
-
209
- </div>
210
-
211
-
212
-
213
-
214
-
215
- <div class="form-group">
216
-
217
- <div class="col-md-12 control">
218
-
219
- <div style="border-top: 1px solid#888; padding-top:15px; font-size:85%" >
220
-
221
- Don't have an account!
222
-
223
- <a href="#" onClick="$('#loginbox').hide(); $('#signupbox').show()">
224
-
225
- Sign Up Here
226
-
227
- </a>
228
-
229
- </div>
230
-
231
- </div>
232
-
233
- </div>
234
-
235
- </form>
236
-
237
-
238
-
239
-
240
-
241
-
242
-
243
- </div>
244
-
245
- </div>
246
-
247
- </div>
248
-
249
- <div id="signupbox" style="display:none; margin-top:50px" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
250
-
251
- <div class="panel panel-info">
252
-
253
- <div class="panel-heading">
254
-
255
- <div class="panel-title">Sign Up</div>
256
-
257
- <div style="float:right; font-size: 85%; position: relative; top:-10px"><a id="signinlink" href="#" onclick="$('#signupbox').hide(); $('#loginbox').show()">Sign In</a></div>
258
-
259
- </div>
260
-
261
- <div class="panel-body" >
262
-
263
- <form id="signupform" class="form-horizontal" role="form">
264
-
265
-
266
-
267
- <div id="signupalert" style="display:none" class="alert alert-danger">
268
-
269
- <p>Error:</p>
270
-
271
- <span></span>
272
-
273
- </div>
274
-
275
-
276
-
277
-
278
-
279
-
280
-
281
- <div class="form-group">
282
-
283
- <label for="email" class="col-md-3 control-label">Email</label>
284
-
285
- <div class="col-md-9">
286
-
287
- <input type="text" class="form-control" name="email" placeholder="Email Address">
288
-
289
- </div>
290
-
291
- </div>
292
-
293
-
294
-
295
- <div class="form-group">
296
-
297
- <label for="firstname" class="col-md-3 control-label">First Name</label>
298
-
299
- <div class="col-md-9">
300
-
301
- <input type="text" class="form-control" name="firstname" placeholder="First Name">
302
-
303
- </div>
304
-
305
- </div>
306
-
307
- <div class="form-group">
308
-
309
- <label for="lastname" class="col-md-3 control-label">Last Name</label>
310
-
311
- <div class="col-md-9">
312
-
313
- <input type="text" class="form-control" name="lastname" placeholder="Last Name">
314
-
315
- </div>
316
-
317
- </div>
318
-
319
- <div class="form-group">
320
-
321
- <label for="password" class="col-md-3 control-label">Password</label>
322
-
323
- <div class="col-md-9">
324
-
325
- <input type="password" class="form-control" name="passwd" placeholder="Password">
326
-
327
- </div>
328
-
329
- </div>
330
-
331
-
332
-
333
- <div class="form-group">
334
-
335
- <label for="icode" class="col-md-3 control-label">Invitation Code</label>
336
-
337
- <div class="col-md-9">
338
-
339
- <input type="text" class="form-control" name="icode" placeholder="">
340
-
341
- </div>
342
-
343
- </div>
344
-
345
-
346
-
347
- <div class="form-group">
348
-
349
- <!-- Button -->
350
-
351
- <div class="col-md-offset-3 col-md-9">
352
-
353
- <button id="btn-signup" type="button" class="btn btn-info"><i class="icon-hand-right"></i> &nbsp Sign Up</button>
354
-
355
- <span style="margin-left:8px;">or</span>
356
-
357
- </div>
358
-
359
- </div>
360
-
361
-
362
-
363
- <div style="border-top: 1px solid #999; padding-top:20px" class="form-group">
364
-
365
-
366
-
367
- <div class="col-md-offset-3 col-md-9">
368
-
369
- <button id="btn-fbsignup" type="button" class="btn btn-primary"><i class="icon-facebook"></i> Sign Up with Facebook</button>
370
-
371
- </div>
372
-
373
-
374
-
375
- </div>
376
-
377
-
378
-
379
-
380
-
381
-
382
-
383
- </form>
384
-
385
- </div>
386
-
387
- </div>
388
-
389
-
390
-
391
-
392
-
393
-
394
-
395
-
396
-
397
- </div>
398
-
399
- </div>
400
-
401
-
402
-
403
-
404
-
405
-
406
-
407
-
408
-
409
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
410
-
411
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
412
-
413
- </body>
414
-
415
- </html>
245
+ <title>ログイン</title>
246
+
247
+ </head>
248
+
249
+ <body>
250
+
251
+
252
+
253
+ <?php echo h($username)."さん、こんにちは!"; ?>
254
+
255
+
256
+
257
+ <a href="logout.php">ログアウトする</a>
258
+
259
+
260
+
261
+ </body>
262
+
263
+ </html>
416
264
 
417
265
 
418
266
 
@@ -420,7 +268,7 @@
420
268
 
421
269
 
422
270
 
423
- 遷移先 login_admin.php
271
+ login_check.php (チェック) html省略
424
272
 
425
273
  ```php
426
274
 
@@ -440,64 +288,224 @@
440
288
 
441
289
 
442
290
 
443
- $username = '';
444
-
445
-
446
-
447
-
448
-
449
- // ロン状態チェッ
291
+ // スサトリクエストフォージュリ(CSRF)対策トーン判定
450
-
292
+
451
- if (!isset($_SESSION["username"])) {
293
+ if ($_POST["token"] != $_SESSION["token"]) {
452
-
294
+
453
- header("Location: login_form.php");
295
+ echo "不正アクセスの可能性あり。";
454
-
296
+
455
- exit();
297
+ exit();
298
+
299
+ }
300
+
301
+
302
+
303
+ // クリックジャッキング対策
304
+
305
+ header("X-FRAME-OPTIONS: SAMEORIGIN");
306
+
307
+
308
+
309
+ // 変数の初期化
310
+
311
+ $email = '';
312
+
313
+
314
+
315
+ // セッション変数の定義
316
+
317
+
318
+
319
+ // エラーメッセージの配列の初期化
320
+
321
+ $errors = array();
322
+
323
+ // セッション変数の初期化
324
+
325
+ $_SESSION['errors'] = array();
326
+
327
+
328
+
329
+ // データベース接続
330
+
331
+ require_once(__DIR__. '/db.php');
332
+
333
+
334
+
335
+ // 前後にある半角全角スペースを削除する関数
336
+
337
+ function spaceTrim($str) {
338
+
339
+
340
+
341
+ // 行頭
342
+
343
+ $str = preg_replace('/^[ ]+/u', '', $str);
344
+
345
+ // 末尾
346
+
347
+ $str = preg_replace('/[ ]+$/u', '', $str);
348
+
349
+
350
+
351
+ return $str;
456
352
 
457
353
  }
458
354
 
459
355
 
460
356
 
357
+ // エラーメッセージの初期化
358
+
461
- function h($string) {
359
+ $errors = array();
360
+
361
+
362
+
462
-
363
+ // POST時
364
+
365
+ if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == "POST") {
366
+
367
+
368
+
369
+ // POSTされたデータを各変数に入れる
370
+
463
- return htmlspecialchars($string, ENT_QUOTES, "UTF-8");
371
+ $username = filter_input(INPUT_POST, 'username');
372
+
373
+ $password = filter_input(INPUT_POST, 'password');
374
+
375
+
376
+
377
+ // 前後にある半角全角スペースを削除
378
+
379
+ $username = spaceTrim($username);
380
+
381
+ $password = spaceTrim($password);
382
+
383
+
384
+
385
+ // アカウント入力判定
386
+
387
+ if (empty($_SESSION["username"])) {
388
+
389
+ $errors[] = "usernameもしくは、emailが入力されていません。";
390
+
391
+ }
392
+
393
+
394
+
395
+ // パスワード入力判定
396
+
397
+ if (empty($_SESSION["password"])) {
398
+
399
+ $errors[] = "パスワードが入力されていません。";
400
+
401
+ } elseif (preg_match('/^[0-9a-zA-Z]{1,7}$/', $password)) {
402
+
403
+ $errors[] = "パスワードは8文字以上で入力してください。";
404
+
405
+ } else {
406
+
407
+ $password_hide = str_repeat('*', strlen($password));
408
+
409
+ }
464
410
 
465
411
  }
466
412
 
467
413
 
468
414
 
469
- ?>
470
-
471
-
472
-
473
- <!DOCTYPE html>
474
-
475
- <html lang="ja">
476
-
477
- <head>
478
-
479
- <meta charset="utf-8">
480
-
481
- <title>ログイ</title>
482
-
483
- </head>
484
-
485
- <body>
486
-
487
-
488
-
489
- <?php echo h($username)."さん、こんにちは!"; ?>
490
-
491
-
492
-
493
- <a href="logout.php">ログアウトする</a>
494
-
495
-
496
-
497
- </body>
498
-
499
- </html>
500
-
501
-
415
+ // エラーがなければ実行する
416
+
417
+ if (count($errors) == 0) {
418
+
419
+ try {
420
+
421
+ // 例外処理を投げる(スロー)ようにする
422
+
423
+ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
424
+
425
+
426
+
427
+ // アカウトで検索
428
+
429
+ $statement = $dbh->prepare("SELECT * FROM users WHERE email=(:email)");
430
+
431
+ $statement->bindValue(":email", $email, PDO::PARAM_STR);
432
+
433
+ $statement->execute();
434
+
435
+
436
+
437
+ // アカウントが一致
438
+
439
+ if ($row = $statement->fetch()) {
440
+
441
+ $db_password = $row["password"];
442
+
443
+
444
+
445
+ // パスワードが一致
446
+
447
+ if ($password === $db_password) {
448
+
449
+
450
+
451
+ // セッションハイジャック対策
452
+
453
+ session_regenerate_id(true);
454
+
455
+
456
+
457
+ $_SESSION["username"] = $username;
458
+
459
+ header("Location: login_admin.php");
460
+
461
+ exit();
462
+
463
+ } else {
464
+
465
+ $errors[] = "アカウント及びパスワードが一致しません。";
466
+
467
+ }
468
+
469
+ } else {
470
+
471
+ $errors[] = "アカウント及びパスワードが一致しません。";
472
+
473
+ }
474
+
475
+
476
+
477
+ if (count($errors) > 0) {
478
+
479
+ $errors = $_SESSION["errors"];
480
+
481
+ foreach ($errors as $value) {
482
+
483
+ echo $error;
484
+
485
+ }
486
+
487
+ header("Location: login_form.php");
488
+
489
+ }
490
+
491
+
492
+
493
+ // データベース切断
494
+
495
+ $dbh = null;
496
+
497
+ } catch (PDOException $e) {
498
+
499
+ print("Error:" .$e->getMessage());
500
+
501
+ die();
502
+
503
+ }
504
+
505
+ }
506
+
507
+
508
+
509
+ ?>
502
510
 
503
511
  ```

1

追記

2017/12/06 00:16

投稿

dog57
dog57

スコア131

test CHANGED
File without changes
test CHANGED
File without changes