ログインフォームの制作時の検証について
送信したユーザ名とパスワードをデーターベースから取得し、password_verify()で比較検証したときに
var_dump()で中身を確認し$row['password'] と$submitted_passwordの中身はstring(6)"dog123"だったがtrueにならなかった
//これはサブミットされたパスワードが一致した場合にのみtrueに設定される
$password_ok = false;
$input['username'] = $_POST['username'] ?? '';
$submitted_password = $_POST['password'] ?? '';
$stmt = $db->prepare('SELECT password FROM users WHERE username = ?');
$stmt->bindValue(1, $input['username']);
$stmt->execute();
$row = $stmt->fetch();
if ($row) {
//password_verify()で比較する中身
var_dump($submitted_password, $row['password']);
//ハッシュ化しないとパスワードが検証できない;
$password_ok = password_verify($submitted_password, $row['password']);
}
//passwordが検証の結果一致しなかった時errorsにメッセージを挿入
if (!$password_ok) {
$errors[] = 'Please enter a valid username and password.';
}
return array($errors, $input);
}
ハッシュ化していないときのパスワードでログインしようとしたときの中身
ハッシュ化したときのコード
//これはサブミットされたパスワードが一致した場合にのみtrueに設定される
$password_ok = false;
$input['username'] = $_POST['username'] ?? '';
$submitted_password = $_POST['password'] ?? '';
$stmt = $db->prepare('SELECT password FROM users WHERE username = ?');
$stmt->bindValue(1, $input['username']);
$stmt->execute();
$row = $stmt->fetch();
//passwordをここでハッシュ化してみた
$data = password_hash($row['password'], PASSWORD_DEFAULT);
//行がなければ、ユーザ名はどの行とも一致していない
if ($data) {
//password_verify()で比較する中身
var_dump($submitted_password, $data);
print '<br>';
//ハッシュ化パスワードと送信されたパスワード検証
$password_ok = password_verify($submitted_password, $data);
}
//passwordが検証の結果一致しなかった時errorsにメッセージを挿入
if (!$password_ok) {
$errors[] = 'Please enter a valid username and password.';
}
return array($errors, $input);
}
ログイン機能が動作し"Welcom,alice"と表示された
https://www.php.net/manual/ja/function.password-verify.php
を確認するとpassword_verify — パスワードがハッシュにマッチするかどうかを調べるとなっていた