前提・実現したいこと
ハッシュ関数を利用した簡易的なログイン機能の実装。
該当のソースコード
<?php if(isset($_POST['post'])){ //パスワードの暗号化 $hash_pass = password_hash($_POST['pass'], PASSWORD_DEFAULT); // 接続するデータベースの情報 $dsn = 'mysql:dbname=myapp;host=localhost;charset=utf8'; $username = 'toshiki'; $pass = 'fumiya1118'; $options = array( // SQL実行失敗時にはエラーコードのみ設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT, // デフォルトフェッチモードを連想配列形式に設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); try { // データベースへの接続開始 $dbh = new PDO($dsn, $username, $pass, $options); // bindParamを利用したSQL文の実行 $sql = 'INSERT INTO users (email, password) VALUES(:email, :password);'; $sth = $dbh->prepare($sql); $sth->bindParam(':email', $_POST['email']); $sth->bindParam(':password', $hash_pass); $sth->execute(); echo "成功"; // データベースへの接続に失敗した場合 } catch (PDOException $e) { print('接続失敗:' . $e->getMessage()); die(); } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ユーザ情報の登録画面</title> </head> <body> <p>ユーザ情報</p> <form action="" method="post"> email:<input type="text" name="email"><br> PASS:<input type="text" name="pass"> <input type="submit" name="post" value="送信"> </form> </body> </html>
<?php if(isset($_POST['post'])){ // 接続するデータベースの情報 $dsn = 'mysql:dbname=myapp;host=localhost;charset=utf8'; $username = 'toshiki'; $pass = 'fumiya1118'; $options = array( // SQL実行失敗時にはエラーコードのみ設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT, // デフォルトフェッチモードを連想配列形式に設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); try { // データベースへの接続開始 $dbh = new PDO($dsn, $username, $pass, $options); // bindParamを利用したSQL文の実行 $sql = 'SELECT password FROM users WHERE email = :email;'; $sth = $dbh->prepare($sql); $sth->bindParam(':email', $_POST['email']); $sth->execute(); $users = $sth->fetch(); if(password_verify($_POST['pass'], $users['password'])){ print '認証成功'; }else{ print '認証失敗'; } // データベースへの接続に失敗した場合 } catch (PDOException $e) { print('接続失敗:' . $e->getMessage()); die(); } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ログイン画面</title> </head> <body> <form action="" method="post"> email:<input type="text" name="email"><br> PASS:<input type="text" name="pass"> <input type="submit" name="post" value="ログイン"> </form> </body> </html>
試したこと
データべースにハッシュ化されたパスワードを保存することはできたのですが、password_verify関数のところで認証失敗となってしまいます。
php
1$a='$2y$10$23eOLbv.rpmpGUzoNio5t.7w2/Hpc9bY1SIke.EEe2H5yfJo65RzO'; 2 3 if(password_verify('a', $a)){ 4 print '認証成功'; 5 }else{ 6 print '認証失敗'; 7 }
実際に入力したパスワードのハッシュを直にいれたら、認証成功と出ました。
補足情報(FW/ツールのバージョンなど)
PHP 7.3.5
mysql 15.1
回答1件
あなたの回答
tips
プレビュー