質問編集履歴

2

ソースコード変更

2017/09/27 14:00

投稿

shaobao
shaobao

スコア33

test CHANGED
File without changes
test CHANGED
@@ -12,13 +12,15 @@
12
12
 
13
13
 
14
14
 
15
- テストに関しては、DBにあるcode、パスワードを入力し、ログイントップ画面まで一連進めますが、トップ画面にお名前を表示させたかったが、表示されない状態です。
16
-
17
- var_dumpデバしてみると、デーダベースからなぜ「null」値が返してくる。
15
+ password_hash()パスワードをハシュ化してからDBへ登録される。
16
+
18
-
17
+ ログイン画面では、password_verify()関数で$_POSTされたパスワードと
19
-
20
-
18
+
21
- 下記の3つファイル作成ました
19
+ DBからハッシュ化されたパスワード取り出て比較する
20
+
21
+
22
+
23
+ ところが、ログイン画面から正しくパスワードを入力しても、「パスワード間違っています。」と表示される。デバッグしてみたら、$_POSTされた値は入力の値である、DBから取得したパスワードがハッシュ化された値である。どっちが良くないでしょうか?
22
24
 
23
25
 
24
26
 
@@ -36,71 +38,243 @@
36
38
 
37
39
  ```<?php
38
40
 
41
+ ini_set("display_errors", On);
42
+
43
+ error_reporting(E_ALL);
44
+
39
45
  session_start();
40
46
 
47
+ require '../lib/functions.php';
48
+
41
49
  // session_regenerate_id(true);
42
50
 
51
+ require '../header.php';
52
+
53
+
54
+
55
+ //トークンを確認
56
+
57
+ if(!isset($_SESSION['token'])){
58
+
59
+ $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
60
+
61
+ }
62
+
63
+
64
+
65
+ $token = $_SESSION['token'];
66
+
67
+ ?>
68
+
69
+
70
+
71
+ <div class="staff_add">
72
+
73
+ <p>スタッフログイン</p>
74
+
75
+ <form action="staff_login_check.php" method="post">
76
+
77
+ <p>スタッフコード</p>
78
+
79
+ <p><input type="text" name="code" value="" maxlength="100" required></p>
80
+
81
+ <p>パスワード</p>
82
+
83
+ <p><input type="password" name="pass" value="" required></p>
84
+
85
+ <div>
86
+
87
+ <!--<input type="button" onclick="history.back()" value="戻る">-->
88
+
89
+ <input type="hidden" name="token" value="<?php echo h($token); ?>">
90
+
91
+ <input type="submit" value="ログイン">
92
+
93
+ </div>
94
+
95
+ </form>
96
+
97
+ </div>
98
+
99
+
100
+
101
+ <?php
102
+
103
+ require '../footer.php';
104
+
105
+ コード
106
+
107
+ ```
108
+
109
+
110
+
111
+ 次、staff_login_check.php
112
+
113
+ ```<?php
114
+
115
+ ini_set("display_errors", On);
116
+
117
+ error_reporting(E_ALL);
118
+
119
+ session_start();
120
+
121
+ // session_regenerate_id(true);
122
+
43
123
  require '../lib/functions.php';
44
124
 
45
125
  require '../header.php';
46
126
 
127
+
128
+
129
+ if($_SERVER["REQUEST_METHOD"] !== "POST"){
130
+
131
+ die("不正アクセス");
132
+
133
+ }
134
+
135
+
136
+
137
+ //トークンをcheck
138
+
139
+ if(isset($_POST['token']) && isset($_SESSION['token'])){
140
+
141
+ $token = $_POST['token'];
142
+
143
+
144
+
145
+ if($token != $_SESSION['token']){
146
+
147
+ die('不正アクセスですが発生!');
148
+
149
+ }
150
+
151
+ }else{
152
+
153
+ die('操作が間違っています。最初からやり直してください。');
154
+
155
+ }
156
+
157
+
158
+
159
+ //DBへ接続
160
+
161
+ try{
162
+
163
+ //変数にpostされたデータを代入
164
+
165
+ $code = isset($_POST['code']) ? $_POST['code'] : '';
166
+
167
+ $pass = isset($_POST['pass']) ? $_POST['pass'] : '';var_dump($pass);
168
+
169
+ //$passhash = password_hash($pass, PASSWORD_DEFAULT);
170
+
171
+ $pdo = new PDO('mysql:host=localhost;dbname=shop;charset=utf8', 'root', '');
172
+
173
+ $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
174
+
175
+ $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
176
+
177
+ $sql = 'select * from ms_staff where code=?';
178
+
179
+ $product = $pdo->prepare($sql);
180
+
181
+ $product->bindValue(1, $code);
182
+
183
+ $product->execute();
184
+
185
+ $rec = $product->fetch(PDO::FETCH_ASSOC);
186
+
187
+ var_dump($rec);
188
+
189
+ var_dump($rec['code']);
190
+
191
+ var_dump($rec['password']);
192
+
193
+ var_dump($rec['name']);
194
+
195
+ $pdo = null;
196
+
197
+
198
+
199
+
200
+
201
+ }catch(Exception $e){
202
+
203
+ die('接続エラー:' . $e->getMessage());
204
+
205
+ }
206
+
207
+
208
+
47
209
  ?>
48
210
 
49
-
50
-
51
- <div class="staff_add">
211
+ <div class="staff_add">
52
-
212
+
53
- <p>スタッフログイン</p>
213
+ <p>商品追加</p>
54
214
 
55
215
  <?php
56
216
 
217
+ // if(isset($rec)){
218
+
219
+ // $passdb = $rec['password'];
220
+
57
- //errorがあったら表示
221
+ // }
58
-
222
+
59
- if(isset($_SESSION['error'])){
223
+ if (password_verify($pass, $rec['password'])) {
60
-
224
+
61
- foreach($_SESSION['error'] as $value){
225
+ echo 'Password is right';
226
+
62
-
227
+ } else {
228
+
63
- echo '<span class="error">' . h($value) . '</span>' . '\n';
229
+ echo 'パスワード間違っています。';
64
-
230
+
65
- }
231
+ }
232
+
66
-
233
+ echo "<pre>";
234
+
67
- }
235
+ print_r($pass);
236
+
237
+ echo '\n';
238
+
239
+ print_r($rec['password']);
240
+
241
+ echo "</pre>"
242
+
243
+
244
+
245
+ // if(password_verify($pass, $rec['password'])){
246
+
247
+ // $_SESSION['login'] =1;
248
+
249
+
250
+
251
+ // $_SESSION['staff_code'] = isset($rec['code']) ? $rec['code'] : '';
252
+
253
+ // $_SESSION['name'] = isset($rec['name']) ? $rec['name'] : '';var_dump($_SESSION['name']);
254
+
255
+ // $_SESSION['rec'] = isset($rec);
256
+
257
+ // $_SESSION['password'] = isset($rec['password']) ? $rec['password'] : '';
258
+
259
+ // header('Location: staff_top.php');
68
260
 
69
261
 
70
262
 
71
- //変数にpostされたデータを代入
263
+ // }else{
72
-
264
+
73
- $code = isset($_POST['code']) ? $_POST['code'] : '';
265
+ // echo 'スタッフコードかパスワードが間違っています';
74
-
266
+
75
- $pass = isset($_POST['pass']) ? $_POST['pass'] : '';
267
+ // echo ' <P><a href="staff_login.php">ログイン画面へ</a></P>';var_dump($pass);var_dump($rec['password']);
268
+
269
+
270
+
271
+ // }
76
272
 
77
273
  ?>
78
274
 
79
- <form action="staff_login_check.php" method="post">
80
-
81
- <p>スタッフコード</p>
82
-
83
- <p><input type="text" name="code" value="<?php echo h($code); ?>" maxlength="100" required></p>
84
-
85
- <p>パスワード</p>
86
-
87
- <p><input type="password" name="pass" value="<?php echo md5(h($pass)); ?>" required></p>
88
-
89
- <div>
90
-
91
- <!--<input type="button" onclick="history.back()" value="戻る">-->
92
-
93
- <input type="hidden" name="token" value="<?php echo h($token); ?>">
94
-
95
- <input type="submit" value="ログイン">
96
-
97
- </div>
98
-
99
- </form>
100
-
101
275
  </div>
102
276
 
103
-
277
+
104
278
 
105
279
  <?php
106
280
 
@@ -112,196 +286,4 @@
112
286
 
113
287
 
114
288
 
115
- 次、staff_login_check.php
116
-
117
- ```<?php
118
-
119
- session_start();
120
-
121
- // session_regenerate_id(true);
122
-
123
- require '../lib/functions.php';
124
-
125
- require '../header.php';
126
-
127
-
128
-
129
- if($_SERVER["REQUEST_METHOD"] !== "POST"){
130
-
131
- die("不正アクセス");
132
-
133
- }
134
-
135
-
136
-
137
- //DBへ接続
138
-
139
- try{
140
-
141
- //変数にpostされた変数を代入します
142
-
143
- $code = h($_POST['code']);
144
-
145
- $pass = md5(h($_POST['pass']));
146
-
147
-
148
-
149
- var_dump($code);var_dump($pass);
150
-
151
- $pdo = new PDO('mysql:host=localhost;dbname=shop;charset=utf8', 'root', '');
152
-
153
- $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
154
-
155
- $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
156
-
157
- $sql = 'select name from staff where code=? and password=?';
158
-
159
- $product = $pdo->prepare($sql);
160
-
161
- $product->bindValue(1, $code);
162
-
163
- $product->bindValue(2, $pass);
164
-
165
- $product->execute();
166
-
167
- $rec = $product->fetch(PDO::FETCH_ASSOC);
168
-
169
- var_dump($rec);
170
-
171
- var_dump($rec['code']);
172
-
173
- var_dump($rec['pass']);
174
-
175
- var_dump($rec['name']);
176
-
177
- $pdo = null;
178
-
179
-
180
-
181
-
182
-
183
- }catch(Exception $e){
184
-
185
- die('接続エラー:' . $e->getMessage());
186
-
187
- }
188
-
189
-
190
-
191
- ?>
192
-
193
- <div class="staff_add">
194
-
195
- <p>商品追加</p>
196
-
197
- <?php
198
-
199
- if(isset($rec) == false){
200
-
201
- echo 'スタッフコードかパスワードが間違っています';
202
-
203
- echo ' <P><a href="staff_login.php">ログイン画面へ</a></P>';
204
-
205
- }else{
206
-
207
- $_SESSION['login'] =1;
208
-
209
-
210
-
211
- $_SESSION['staff_code'] = isset($rec['code']) ? $rec['code'] : '';
212
-
213
- $_SESSION['staff_name'] = isset($rec['name']) ? $rec['name'] : '';var_dump($_SESSION['staff_name']);
214
-
215
- header('Location: staff_top.php');
216
-
217
- }
218
-
219
- ?>
220
-
221
- </div>
222
-
223
-
224
-
225
- <?php
226
-
227
- require '../footer.php';
228
-
229
- コード
230
-
231
- ```
232
-
233
- 最後、staff_top.php
234
-
235
- ```<?php
236
-
237
- session_start();
238
-
239
- // session_regenerate_id(true);
240
-
241
- require '../header.php';
242
-
243
- if(!isset($_SESSION['login'])){
244
-
245
- echo 'ログインされません!';
246
-
247
- echo '<p><a href="./staff_login.php">ログイン画面</p>';
248
-
249
- exit();
250
-
251
- }
252
-
253
- // }else{
254
-
255
- // $name = isset($_SESSION['staff_name']) ? $_SESSION['staff_name'] : '';
256
-
257
- // }
258
-
259
- ?>
260
-
261
- <div class="staff_add">
262
-
263
- <?php
264
-
265
- if(isset($_SESSION['staff_name'])){
266
-
267
- $name = $_SESSION['staff_name'];
268
-
269
- echo $name . 'さんログイン中';
270
-
271
- }
272
-
273
- var_dump($name);
274
-
275
- ?>
276
-
277
- <!--<p><?php $name; ?>さんログイン中</p>-->
278
-
279
-
280
-
281
- <p>ショップ管理トップメニュー</p>
282
-
283
-
284
-
285
- <p><a href="../staff_list.php">スタッフ管理</p>
286
-
287
- <p><a href="../product/pro_list.php">商品リスト</p>
288
-
289
-
290
-
291
- </div>
292
-
293
-
294
-
295
- <?php
296
-
297
- require '../footer.php';
298
-
299
-
300
-
301
- コード
302
-
303
- ```
304
-
305
-
306
-
307
289
  以上、お手数をおかけいたしますが、よろしくお願いいたします。

1

テスト手順追加

2017/09/27 14:00

投稿

shaobao
shaobao

スコア33

test CHANGED
File without changes
test CHANGED
@@ -4,9 +4,21 @@
4
4
 
5
5
  今、PHPでログイン認証画面を作ってみております。
6
6
 
7
+ DBの仕様は下記の通りです。
8
+
9
+ - カラム:code,name,password
10
+
11
+ - キー:primary key(code) AUTO_INCREMENT
12
+
13
+
14
+
7
- DBの仕様は、code,name,password 3つカラムcodeはpremarykey autoincrementです。
15
+ テストに関しては、DBにあるcode、パスワードを入力し、ログイントップ画面ま一連進めますが、トップ画面にお名前を表示させたかったが、表示されない状態です。
8
-
16
+
9
- 下記の3つファイルを作成ました。テストすると、名前が表示されない。データは存在してあるのに、正しくログインしてあるし、なぜ「null」データが返してくるか?プログラム自体何か足りているか?悩まして原因が見つかりません
17
+ var_dumpでデバッグてみると、デーダベースからなぜ「null」が返してくる。
18
+
19
+
20
+
21
+ 下記の3つファイルを作成しました。
10
22
 
11
23
 
12
24