質問編集履歴

1

ソースコードを画像からテキストに変更しました。

2022/04/06 10:46

投稿

hitomozi
hitomozi

score10

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の passwordと入力されたpasswordが一致していたらtrueを返し、ログインが成功させるようにしたい。
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
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-04-06/f2c53242-630c-43e0-83f6-0f1a63c0e0dc.png)
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>&raquo;<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
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-04-06/4c4735ed-56a3-4e44-a9dc-9d985bdf0f13.png)
97
+ require('function.php');
19
98
 
99
+ if (isset($_SESSION['form'])) {
100
+ $form = $_SESSION['form'];
20
- phpmyadmin
101
+ } else {
21
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-04-06/3fc3420f-740d-4c4c-a844-8c27af5f64f0.png)
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">&laquo;&nbsp;書き直す</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
  ご助言を頂ければ幸いです。