質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

913閲覧

パスワードのハッシュ化 ログイン機能

Toshinori23

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/06/01 03:26

前提・実現したいこと

ハッシュ関数を利用した簡易的なログイン機能の実装。

該当のソースコード

<?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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/01 03:30

$_POST['pass'], $users['password'] はそれぞれ想定の値が取得できているのでしょうか。
Toshinori23

2019/06/01 04:27

ご質問ありがとうございます。 検証してみたところ、 <入力フォーム> email : a password : a <データベース> email : a password : $2y$10$/7bMN9b5gYoMpRmNw375zOkoxGX0cBwBfpJ/BJHRSwRp9FL1BM.Te <ログイン> email : a password : a と入力して、各var_dumpしたところ $_POST['pass'] : string(1) "a" $users['password'] : string(30) "$2y$10$/7bMN9b5gYoMpRmNw375zOk" となり取り出した$users['password']の値が実際のデータベースの方の文字列よりも短くなっていました。
m.ts10806

2019/06/01 04:32 編集

usersテーブルのテーブル定義、確認してみては? この感じだとpasswordカラムが30桁になってそうですけど
Toshinori23

2019/06/01 04:41

おっしゃる通りでした、データベースのpasswordがchar(30)となっていました。 迅速かつ的確なアドバイスをいただき解決することができました。 ありがとうございました。
guest

回答1

0

自己解決

データベースでpasswordの構造が30文字以上収納できなくなっており、ハッシュ化された文字列をすべて取り出すことができなかった。passwordの構造をより大きいものにしたら、解決した。

投稿2019/06/01 04:44

Toshinori23

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問