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

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

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

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

PHP

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

Q&A

解決済

2回答

1319閲覧

hashされたパスワードの照合のやり方がわかりません。

spcl

総合スコア19

MySQL

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

PHP

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

0グッド

0クリップ

投稿2018/11/18 02:47

編集2018/11/18 02:49

質問失礼します。

現在勉強でログイン機能の勉強をしています。

そこでログイン時、メールアドレスとパスワードを入力してDBに該当する登録があるか照合しています。
DBにハッシュされたパスワードを保存するところまではできました。

しかし実際にそれを使用して称号する際うまく照合できません。
ハッシュされたパスワードはmembersテーブルのpassに格納しています。

コードは下記のようなコードで試しました。

$pass = $_POST['password']; $mail = $_POST['mail']; $statement = $dbh->prepare("SELECT pass FROM members WHERE mail = $mail"); $statement -> execute(); $hash = $statement -> fetch(PDO::FETCH_ASSOC); $check = password_verify($pass, $hash); ==========================================bodyの記述========================================== if($check === true){ echo 'ログインに成功しました。'; } else { echo 'メールアドレスかパスワードが正しくありません。'; }

上記ではメールアドレスかパスワードが正しくありません。が表示されます。
echoで$passと$mailを表示したところ値自体は正しく受け取れていました。
他にも下記のようなコードで試しましたが結果は同じです。

$pass = $_POST['password']; $mail = $_POST['mail']; $statement = $dbh->prepare("SELECT pass FROM members WHERE mail = $mail"); $statement -> execute(); $hash = $statement -> fetch(PDO::FETCH_ASSOC); ==========================================bodyの記述========================================== if(password_verify($pass, $hash['hash'])){ echo 'ログインに成功しました。'; } else { echo 'メールアドレスかパスワードが正しくありません。'; }

いろいろと知識不足かと思いますがご教授やヒントをいただけると幸いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ヒントが欲しいということなんで、

$statement = $dbh->prepare("SELECT pass FROM members WHERE mail = $mail"); $statement -> execute(); $hash = $statement -> fetch(PDO::FETCH_ASSOC); var_dump($hash);

var_dump(); で求めている値がちゃんと入っているか、望んだ形式であるかどうかをチェックしましょう。

あなたは過去の質問で、PDOでのインジェクション対策はこれで大丈夫でしょうか? をしていながら、

$statement = $dbh->prepare("SELECT pass FROM members WHERE mail = $mail");

↑こんなコード書いちゃダメですよ。

投稿2018/11/18 03:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

spcl

2018/11/18 04:38

$statement = $dbh->prepare("SELECT pass FROM members WHERE mail = :mail"); $statement->bindValue(':mail', $mail, PDO::PARAM_STR); $statement -> execute(); $hash = $statement -> fetch(PDO::FETCH_ASSOC); で書いていたところvar_dump($statement)で確認したらsql分がそのままでしたので$mailに変えていました。 直接ユーザーの入力した値をSELECTでも使用しないほうがいいんですね。 どうにかしてまずはハッシュされたpassがきちんと$hashに入るようにがんばってみます。
colling

2018/11/18 04:47

Kosuke_Shibuyaさんが書いているように var_dump($hash);でまずどんな配列が返ってきているのか、確認してみてください。
colling

2018/11/18 04:52

インジェクションの話は、$mail = $_POST['mail'];でPOST値をそのまま入れてるので "SELECT pass FROM members WHERE mail = $mail" だとインジェクションされちゃいますよってことです。
spcl

2018/11/18 05:45

ですよね。 $statement = $dbh->prepare("SELECT pass FROM members WHERE mail = :mail"); $statement->bindValue(':mail', $mail, PDO::PARAM_STR); $statement -> execute(); $hash = $statement -> fetch(PDO::FETCH_ASSOC); 最初これでやろうとしましたが:mailの部分がユーザーが入力したアドレスにならずに一旦$mailで書いていました(>_<)
退会済みユーザー

退会済みユーザー

2018/11/18 05:48

むしろこっちの方が正解に近いのに、質問文のコードの方が質が低い。 > 「:mailの部分がユーザーが入力したアドレスにならずに」←これの何が問題だと思っているのかわかりません。 思い込みで判断するのではなく、コードの実行結果を正確に把握しましょう。
spcl

2018/11/18 05:57

> 「:mailの部分がユーザーが入力したアドレスにならずに」←これの何が問題だと思っているのかわかりません。思い込みで判断するのではなく、コードの実行結果を正確に把握しましょう。 var_dump($statement)で表示したSQLは:mailになっていてもいい(それが当たり前)ということでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/18 05:58

そういうことです。
spcl

2018/11/18 06:09

ありがとうございます! がっつり:mailがユーザーの入力したアドレスになっていないといけないと思い込んでいました。 なのでSQLがキチンと実行できていない=照合でないと思っていました。
guest

0

ベストアンサー

ログイン時に入力したパスワード同じアルゴリズムでハッシュしてデータベース内のハッシュされたパスワードと同じかどうかを照合します。
--追記--
質問のコードでいうと$passハッシュしてから照合です。


チェックのところで password_verify()を使っているので、DBに入っているhashpassword_hash()で作られたものならば、$passのままで良いですね。

DBからうまく取り出せていないのじゃないでしょうか?

--追記--

ハッシュされたパスワードはmembersテーブルのpassに格納しています。

と書かれていますので、$hash['pass']と比較すべきじゃないでしょうか?

投稿2018/11/18 02:52

編集2018/11/18 06:05
colling

総合スコア798

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

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

spcl

2018/11/18 03:11

回答ありがとうございます。 POSTで受け取ったパスワードを一度登録時と同じ様にpassword_hashを行うということでしょうか? 次のように試しました。 $hashpass = password_hash($pass, PASSWORD_DEFAULT);を追加 $check = password_verify($pass, $hash);を $check = password_verify($hashpass, $hash);に修正 試しましたがそれだとハッシュされた文字列が違うのでtrueにはならないです。当然の結果だと思いますが(>_<)
colling

2018/11/18 03:14

入力したパスワードと、 登録時にハッシュしてDB保存したパスワード が同じになるわけないので 入力したパスワードを同じアルゴリズムでハッシュしたものと 登録時にハッシュしてDB保存したパスワード を比べるです
colling

2018/11/18 03:18

ちょっと全体像がつかめませんが、 $check = password_verify()の前に $pass , $hashpass , $hash , $hash['hash']の値をecho して確認してみてください
colling

2018/11/18 03:21

比べる対象の "登録時にハッシュしてDB保存したパスワード" がちゃんと取り出せていますか?
spcl

2018/11/18 04:35

>比べる対象の "登録時にハッシュしてDB保存したパスワード" がちゃんと取り出せていますか? まずはそこらだと思うので取り出せるようにがんばってみます。 その次の壁が同じアルゴリズムでハッシュになりそうですが。
colling

2018/11/18 04:44

>その次の壁が同じアルゴリズムでハッシュになりそうですが。 ここはDB登録時にpassword_hash()関数を使っているなら、$passはハッシュしなくても $check = password_verify($pass, $hash);でいけますね。 $hashがちゃんとDBから取り出せてるのかが問題のような気がします。
spcl

2018/11/18 05:49

var_dump($hash); で確認したところDBに格納されているハッシュされた文字列が取り出せています。 しかし、var_dump($statement)でSQL文を見ると:mailはそのまま:mailです。 $hashをechoするとArrayと表示されます。様は配列に何も入っていないというとでしょうか。 まずは$mailを使わずにvar_dump($statement)でSQLの:mailがきちんとユーザーの入力したアドレスになるようにするところからですかね!
spcl

2018/11/18 05:56

追記です。 $hash['hash']は何も表示されません。
colling

2018/11/18 06:02 編集

>ハッシュされたパスワードはmembersテーブルのpassに格納しています。 と書いてあるので、 $hash[‘pass’]と比較するべきじゃないでしょうか?
spcl

2018/11/18 06:20

ありがとうございます。 ログインに成功しました。が表示されました! しかし気になるのですが$hash['hash']はechoでは何も表示されないのですがいいのでしょうか? そもそもechoの記述の仕方が間違っているのか。。。 echo $hash['hash']; の様に記述しています。
colling

2018/11/18 06:39

>ハッシュされたパスワードはmembersテーブルのpassに格納しています。 なので、 $hash['hash'];は何も入っていません
spcl

2018/11/18 06:49

何度もご回答ありがとうございます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問