質問編集履歴
1
ソースコードを画像からテキストに変更しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,24 +1,187 @@
|
|
1
1
|
**実現したいこと**
|
2
2
|
---
|
3
3
|
ログイン機能の実装練習としてフォームにemail,passwordを入力し、それぞれをPOSTで受け取る。
|
4
|
-
PDOを使用しDBに保存されているhash化(check.phpでhash化)されたパスワードを取り出し、password_verifyを使用して、DBの
|
4
|
+
PDOを使用しDBに保存されているhash化(check.phpでhash化)されたパスワードを取り出し、password_verifyを使用して、DBの パスワードと入力されたパスワードが一致していたらtrueを返し、ログインが成功させるようにしたい。
|
5
5
|
|
6
6
|
|
7
7
|
|
8
8
|
**問題点**
|
9
9
|
---
|
10
|
-
エラーメッセージは出ていませんが、formに入力したパスワードとDBに保存しているハッシュ化したパスワードをpassword_verifyで使用すると必ずfalseが返ってくる。(ハッシュ化したパスワードvar_dumpで出力し、60文字になっていて途切れておらずDBのpasswordカラムもVARCHAR型でカラム幅は255に設定しています。)
|
10
|
+
エラーメッセージは出ていませんが、formに入力したパスワードとDBに保存しているハッシュ化したパスワードをpassword_verifyで使用すると必ずfalseが返ってくる。(ハッシュ化したパスワードはvar_dumpで出力し、60文字になっていて途切れておらずDBのpasswordカラムもVARCHAR型でカラム幅は255に設定しています。)
|
11
11
|
|
12
12
|
---
|
13
13
|
**該当のソースコード**
|
14
|
-
login.php
|
14
|
+
login.php
|
15
|
+
```ここに言語を入力
|
16
|
+
<?php
|
17
|
+
session_start();
|
18
|
+
require('join/function.php');
|
19
|
+
$erroe =[];
|
20
|
+
$email = '';
|
21
|
+
$password = '';
|
22
|
+
if($_SERVER['REQUEST_METHOD'] === 'POST'){
|
23
|
+
$email = filter_input(INPUT_POST,'email',FILTER_SANITIZE_STRING);
|
24
|
+
$password = filter_input(INPUT_POST,'password',FILTER_SANITIZE_STRING);
|
25
|
+
if ($email === '' || $password === ''){
|
26
|
+
$error['login'] ='blank';
|
27
|
+
} else {
|
28
|
+
$dbh = connect();
|
29
|
+
$stmt = $dbh->prepare('select id, name, password from members where email= :email limit 1');
|
30
|
+
$stmt->bindParam(':email',$email,PDO::PARAM_STR);
|
31
|
+
$stmt->execute();
|
32
|
+
$all = $stmt->fetch(PDO::FETCH_ASSOC);
|
33
|
+
$hash = $all['password'];
|
34
|
+
if(password_verify($password,$hash)){
|
35
|
+
session_regenerate_id();
|
36
|
+
$_SESSION['id'] = $all['id'];
|
37
|
+
$_SESSION['name'] = $all['name'];
|
38
|
+
header('Location: index.php');
|
39
|
+
exit();
|
40
|
+
} else {
|
41
|
+
$error['login'] = 'failed';
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
?>
|
46
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
15
|
-
|
47
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
48
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
49
|
+
<head>
|
50
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
51
|
+
<link rel="stylesheet" type="text/css" href="style.css"/>
|
52
|
+
<title>ログイン</title>
|
53
|
+
</head>
|
54
|
+
|
55
|
+
<body>
|
56
|
+
<div id="wrap">
|
57
|
+
<div id="head">
|
58
|
+
<h1>ログイン</h1>
|
59
|
+
</div>
|
60
|
+
<div id="content">
|
61
|
+
<div id="lead">
|
62
|
+
<p>メールアドレスとパスワードを記入してログインしてください。</p>
|
63
|
+
<p>入会手続きがまだの方はこちらからどうぞ。</p>
|
64
|
+
<p>»<a href="join/index.php">入会手続きをする</a></p>
|
65
|
+
</div>
|
66
|
+
<form action="" method="post">
|
67
|
+
<dl>
|
68
|
+
<dt>メールアドレス</dt>
|
69
|
+
<dd>
|
70
|
+
<input type="text" name="email" size="35" maxlength="255" value="<?php echo h($email);?>"/>
|
71
|
+
<?php if (isset($error['login']) && $error['login'] === 'blank'): ?>
|
72
|
+
<p class="error">* メールアドレスとパスワードをご記入ください</p>
|
73
|
+
<?php endif; ?>
|
74
|
+
<?php if (isset($error['login']) && $error['login'] === 'failed'): ?>
|
75
|
+
<p class="error">* ログインに失敗しました。正しくご記入ください。</p>
|
76
|
+
<?php endif; ?>
|
77
|
+
</dd>
|
78
|
+
<dt>パスワード</dt>
|
79
|
+
<dd>
|
80
|
+
<input type="password" name="password" size="35" maxlength="255" value="<?php echo h($password);?>"/>
|
81
|
+
</dd>
|
82
|
+
</dl>
|
83
|
+
<div>
|
84
|
+
<input type="submit" value="ログインする"/>
|
85
|
+
</div>
|
86
|
+
</form>
|
87
|
+
</div>
|
88
|
+
</div>
|
89
|
+
</body>
|
90
|
+
</html>
|
91
|
+
```
|
16
92
|
|
17
93
|
check.php(passwordのhash化を行ったファイルです。)
|
94
|
+
```ここに言語を入力
|
95
|
+
<?php
|
96
|
+
session_start();
|
18
|
-
|
97
|
+
require('function.php');
|
19
98
|
|
99
|
+
if (isset($_SESSION['form'])) {
|
100
|
+
$form = $_SESSION['form'];
|
20
|
-
|
101
|
+
} else {
|
21
|
-
|
102
|
+
header('Location: index.php');
|
103
|
+
exit();
|
104
|
+
}
|
22
105
|
|
106
|
+
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
107
|
+
$dbh = connect();
|
108
|
+
$stmt = $dbh->prepare('insert into members (name, email, password) VALUES (:name, :email, :password)
|
109
|
+
');
|
110
|
+
$password = password_hash($_POST['password'],PASSWORD_DEFAULT);
|
111
|
+
$stmt->bindParam(':name', $form['name'],PDO::PARAM_STR);
|
112
|
+
$stmt->bindParam(':email', $form['email'],PDO::PARAM_STR);
|
113
|
+
$stmt->bindParam(':password', $password,PDO::PARAM_STR);
|
114
|
+
$success = $stmt->execute();
|
115
|
+
if (!$success) {
|
116
|
+
die($dbh->error);
|
117
|
+
}
|
118
|
+
|
119
|
+
unset($_SESSION['form']);
|
120
|
+
header('Location: thanks.php');
|
121
|
+
|
122
|
+
}
|
123
|
+
|
124
|
+
?>
|
125
|
+
<!DOCTYPE html>
|
126
|
+
<html lang="ja">
|
127
|
+
|
128
|
+
<head>
|
129
|
+
<meta charset="UTF-8">
|
130
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
131
|
+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
132
|
+
<title>会員登録</title>
|
133
|
+
|
134
|
+
<link rel="stylesheet" href="../style.css" />
|
135
|
+
</head>
|
136
|
+
|
137
|
+
<body>
|
138
|
+
<div id="wrap">
|
139
|
+
<div id="head">
|
140
|
+
<h1>会員登録</h1>
|
141
|
+
</div>
|
142
|
+
|
143
|
+
<div id="content">
|
144
|
+
<p>記入した内容を確認して、「登録する」ボタンをクリックしてください</p>
|
145
|
+
<form action="" method="post">
|
146
|
+
<dl>
|
147
|
+
<dt>ニックネーム</dt>
|
148
|
+
<dd><?php echo h($form['name']); ?></dd>
|
149
|
+
<dt>メールアドレス</dt>
|
150
|
+
<dd><?php echo h($form['email']); ?></dd>
|
151
|
+
<dt>パスワード</dt>
|
152
|
+
<dd>
|
153
|
+
【表示されません】
|
154
|
+
</dd>
|
155
|
+
</dl>
|
156
|
+
<div><a href="index.php?action=rewrite">« 書き直す</a> | <input type="submit" value="登録する" /></div>
|
157
|
+
</form>
|
158
|
+
</div>
|
159
|
+
|
160
|
+
</div>
|
161
|
+
</body>
|
162
|
+
</html>
|
163
|
+
```
|
164
|
+
|
165
|
+
phpmyadmin (hash化されている元のパスワードは[abcd]となっております。)
|
166
|
+
```ここに言語を入力
|
167
|
+
+----+------+----------------+--------------------------------------------------------------+---------+---------------------+---------------------+
|
168
|
+
| id | name | email | password | picture | created | modified |
|
169
|
+
+----+------+----------------+--------------------------------------------------------------+---------+---------------------+---------------------+
|
170
|
+
| 89 | name | test@email.com | $2y$10$EkL.Rb1LSDUDPEa3aS/XIeI3teJHFupmz/JjHmJEMZm4PF3SIgVAW | | 2022-04-06 19:31:43 | 2022-04-06 19:31:43 |
|
171
|
+
+----+------+----------------+--------------------------------------------------------------+---------+---------------------+---------------------+
|
172
|
+
```
|
173
|
+
```ここに言語を入力
|
174
|
+
+----------+--------------+------+-----+---------------------+----------------+
|
175
|
+
| Field | Type | Null | Key | Default | Extra |
|
176
|
+
+----------+--------------+------+-----+---------------------+----------------+
|
177
|
+
| id | int(11) | NO | PRI | NULL | auto_increment |
|
178
|
+
| name | text | NO | | NULL | |
|
179
|
+
| email | text | NO | | NULL | |
|
180
|
+
| password | varchar(255) | NO | | NULL | |
|
181
|
+
| picture | text | NO | | NULL | |
|
182
|
+
| created | timestamp | NO | | current_timestamp() | |
|
183
|
+
| modified | timestamp | NO | | current_timestamp() | |
|
184
|
+
+----------+--------------+------+-----+---------------------+----------------+
|
185
|
+
```
|
23
186
|
|
24
187
|
ご助言を頂ければ幸いです。
|