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

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

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

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

Q&A

解決済

1回答

2482閲覧

入力された情報をデータベースに格納されているハッシュ化された値と照合する方法

newyee

総合スコア213

PHP

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

0グッド

0クリップ

投稿2019/04/11 11:10

編集2019/04/11 11:16

簡易な交流サイトのログイン機能を作成しているのですが、ユーザー情報(名前、パスワード)が入力された際に、データベースに保存されてある、PHPの「password_hash」関数により、ハッシュ化されたパスワード及び、名前との照合を行いたいのですが、方法はありますでしょうか?
以下は、ログイン画面の表示及び、ログイン処理を行う「login.php」になります。

php

1<?php 2require_once 'function.php'; 3require_once 'config.php'; 4session_start(); 5if(isset($_SESSION['id'])){ 6 7 header('Location:index.php'); 8 9}else if(isset($_POST['name']) && isset($_POST['password'])){ 10 $name = filter_input(INPUT_POST,'name'); 11 $password = filter_input(INPUT_POST,'password'); 12 $hash_password = password_hash($password,PASSWORD_DEFAULT); 13 14 try{ 15 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 16 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 17 $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 18 $stmt = $db->prepare(" 19 SELECT id,name,password FROM users WHERE name=:name 20 "); 21 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 22 23 $stmt->execute(); 24 25 if($row = $stmt->fetch()){ 26 $_SESSION['id'] = $row['id']; 27 28 session_regenerate_id(true); 29 30 31 header('Location : index.php'); 32 exit(); 33 }else{ 34 header('Location:login.php'); 35 exit(); 36 } 37 }catch(PDOException $e){ 38 die('エラー:' . $e->getMessage()); 39 } 40 41}else{ 42 43?> 44<!DOCTYPE html> 45<html lang="en"> 46<head> 47 <meta charset="UTF-8"> 48 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 49</head> 50<body> 51 <h1>テニススクール交流サイト</h1> 52 <h2>ログイン</h2> 53 <form action="login.php"method="post"> 54 <p>ユーザ名:<input type="text"name="name"></p> 55 <p>パスワード:<input type="password"name="password"></p> 56 <p><input type="submit"value="ログイン"></p> 57 </form> 58</body> 59</html> 60 61 62<?php } ?> 63

上記コードでは、$_SESSION['id']が存在しない(ログインしていない)場合に、入力された内容に基づいて、データベースに格納されている情報との照合を行おうと思ったのですが、パスワードを「password_hash」によりハッシュ化しているため、名前とパスワードを指定して、データベースから値を取得することができず、データベースに入っているデータとの照合ができません。
解決する方法などありましたら、教えてください。
よろしくお願いします

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

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

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

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

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

m.ts10806

2019/04/11 21:02 編集

さすがにこれは丸投げがすぎますね。 password_hash()とpassword_verify()をペアで対応する記事は幾らでも出てきますしPHPマニュアルにもpassword_verify()のことは書いてあります。
newyee

2019/04/11 12:05

もちろん「password_hash()とpassword_vefify()をペアで対応する」ことは分かっていますが、それをどう生かして、値を照合するのかといった部分が分からなかったんですよね
newyee

2019/04/11 12:06

回答を頂いたので、今実践している所ですが。
m.ts10806

2019/04/11 12:07

それを具体的に書かれないとどこまで把握してるか誰もわかりませんよ。 誰もあなたとペアプロやっているわけじゃないので、きちんと「全く何も知らない他人」に向けて質問を書いてください。
newyee

2019/04/11 12:13

maisumakunさんには伝わっていたみたいですけどね
m.ts10806

2019/04/11 21:03 編集

はて?「ペアで対応することが伝わっている」ならなぜpassword_verify()の使用をすすめられるんでしょうか。 調べてもないし検証もしてない ということしか伝わってません。
newyee

2019/04/11 12:23

全部読んでください。 「条件を名前だけでデータベースから抽出して」とも書いてあります
m.ts10806

2019/04/11 21:03 編集

password_hash() で検索したら結構最初のほうに出てくる記事をスルーしてますよね。 マニュアルを見るとNoteじゃなく例にちょっと考えたらわかるコードが挙がっていますね。 何を調べて何を試したのでしょうか。これくらいで失敗するのを恐れて他人に丸投げするのはやめてください。 若干エスパーに近い回答をもらっただけでドヤ顔しないでください。 password_verify()をすすめられている時点で自身が把握されていること試したこと半分も伝わってません。
newyee

2019/04/11 12:42 編集

まぁ客観的に見れば、エスパーなどではなく、質問内容から分からない部分が正しく読み取れた為、適切な回答が得られただけだと思いますよ
m.ts10806

2019/04/11 12:44

password_hash() で検索したら結構最初のほうに出てくる記事をスルーしてますよね。 マニュアルを見るとNoteじゃなく例にちょっと考えたらわかるコードが挙がっていますね。 何を調べて何を試したのでしょうか。
退会済みユーザー

退会済みユーザー

2019/04/11 12:47

teratailのQAはナレッジベースとして、同じ疑問を持った質問者のためのものでもあります。たまたまエスパー回答であなたの疑問が解決できたとしても、あなたより経験の浅い質問者のためになるように、情報は補足しましょう。
newyee

2019/04/11 12:51

>情報は補足しましょう どのような情報を補足するべきと考えられますでしょうか?
退会済みユーザー

退会済みユーザー

2019/04/11 12:52

mts10806さんの指摘内容です。
m.ts10806

2019/04/11 12:53

>どのような情報を補足するべきと考えられますでしょうか? (3回目)何を調べて何を試したのでしょうか。
newyee

2019/04/11 12:54

phpマニュアルは調べましたよ
m.ts10806

2019/04/11 12:57

それこの質問内容でわかりますか?自身の質問を「客観的に」読んでみてください。 何も書いてないと本当に調べず試さず質問する人との区別はつきませんよ。 「調べた」だけじゃなく「試す」必要がありますよね。 https://teratail.com/help/question-tips#questionTips1-2 >投稿前に自分で一度調べてみましょう。そして調べたことを元に、一度は自分でやってみましょう。 検索して見つけたページでわからない事があれば、どのページのどの部分がわからないのかを明確に記し質問してみてください。 何を参考にして何をどう試したかこの質問内容でわかりますか?「客観的に」読んでみてください。
退会済みユーザー

退会済みユーザー

2019/04/11 13:01 編集

@newyee > phpマニュアルは調べましたよ これが、「何を調べて何を試したのでしょうか」の回答なら、あなたかなりまずいですよ。 本当に受け応えが成立しない人を相手に回答する人の身にもなってください。 あなたに回答すること自体、何も生まないし、誰のためにもなりません。 teratailを使うにあたって、他人の時間をいただいているということを配慮すべきです。最低限のマナーなのでそれができていないのは本当に致命的です。
newyee

2019/04/11 14:21

正直な所、何を試すか、と言った部分で、何を伝えたいのかが分からないというのはあるんですよね マニュアルは調べましたが、それで何を試すのか、と言った部分に疑問があります
退会済みユーザー

退会済みユーザー

2019/04/11 14:24

それならそうとその事情を質問文に含めるべきでしょう。 あなたはおよそ聞きたいことと書いている質問内容が一致していないことが問題です。
newyee

2019/04/11 14:38

質問内容に関しては、自分の中では、maisumakunさんに、自分の求めていた回答を頂いた為、うまく伝わっていると思っているのですが、具体的に何を追記すべきと考えられていますでしょうか?
m.ts10806

2019/04/11 19:25

なぜこれで分からないのかが分かりません。 何を調べたか、何を試したかあなた自身を除いて知ってる人はいませんよね。 この質問内容でphpマニュアルを観たことは誰にも伝わってません。だからmaisumakunさんもphpマニュアルを根拠資料に出してますよ? わかりませんか?プログラミング能力以前の問題が多発しているご自身に気づきませんか?
m.ts10806

2019/04/11 23:30 編集

うちの子はまだ未就学児(小学生未満)ですが、まだうちの子のほうが理解力があります。では、未就学児に向けるつもりで質問内容について確認と追記修正依頼をします。 下記で質問本文に明示されてないものは加筆修正が必要です。自己判断ではなく客観的視点で自身の質問を見つめ直してください。 1。password_hash()はどこから持ってきましたか 2。password_hash()のPHPマニュアルを読みましたか 3。2をしたのならどう理解していますか 4。password_verify()とペアで使う、というのをどこでどう知りましたか 5。4で事前に知っていたの場合なぜpassword_verify()について質問内に一切言及されてませんか 6。質問内のどこを読んだらPHPマニュアルを確認したこと、password_verify()とペアで使うことを知っていたことが分かりますか 7。質問内のどこを読んだら試したことと調べたことが分かりますか 8。スペルミスには気づきましたか 9。password_verify()とペアであると質問前に分かっている場合、回答でpassword_verify()の使用をすすめられていてなぜ解決ですか 10。質問前に分かっていたことはどれだけこの質問に書かれていますか ※解決済みにされてますが、この質問、誰のためにもなりません。結局どう解決したかコメントもない ※ちなみに本当に解決なら加筆修正は厳禁です。きちんと解決した内容や手順を残すにとどめてください
newyee

2019/04/11 23:38

>プログラミング能力以前の問題が多発しているご自身に気づきませんか? まさにあなたのことですね。 まぁあなたはこういったらことに詳しいので、偉そうに超上から目線で物を言えるのかもしれませんが、はたからみたらただの嫌な奴でしかないです。 まさにあなたの言ったことを、自分自信で、客観的に捉え受け止めて欲しいものですがね...
m.ts10806

2019/04/11 23:44 編集

追記修正依頼の場です。私の指摘は質問本文に対する客観的事実に基づく指摘です。 反論だけに必死になるのではなく、追記修正依頼に応えてください。 ちなみにこの質問やあなたの姿勢は反面教師程度にしか参考にできません。
newyee

2019/04/11 23:54

そうですかね? 客観的に見れば、プログラミング勉強して詳しくなったとしてもあなたみたいな人間にはなりたくないと思いますよ
m.ts10806

2019/04/11 23:55

追記修正依頼の場です。私の指摘は質問本文に対する客観的事実に基づく指摘です。 反論だけに必死になるのではなく、追記修正依頼に応えてください。
m.ts10806

2019/04/11 23:59 編集

下記で質問本文に明示されてないものは加筆修正が必要です。自己判断ではなく客観的視点で自身の質問を見つめ直してください。※一部確認事項の表現を修正 1。password_hash()はどこから持ってきましたか 2。password_hash()をPHPマニュアルで確認しましたか 3。2をしたのならどう理解していますか 4。password_verify()とペアで使う、というのをどこでどう知りましたか 5。4で事前に知っていたの場合なぜpassword_verify()について質問内に一切言及されてませんか 6。質問内のどこを読んだらPHPマニュアルを確認したこと、password_verify()とペアで使うことを知っていたことが分かりますか 7。質問内のどこを読んだら試したことと調べたことが分かりますか 8。スペルミスには気づきましたか 9。password_verify()とペアであると質問前に分かっている場合、回答でpassword_verify()の使用をすすめられていてなぜ解決ですか 10。質問前に分かっていたことはどれだけこの質問に書かれていますか ※解決済みにされてますが、この質問、誰のためにもなりません。結局どう解決したかコメントもない ※ちなみに本当に解決なら加筆修正は厳禁です。きちんと解決した内容や手順を残すにとどめてください
newyee

2019/04/12 00:00 編集

以前、出典を書く書かないの話しをしていた時、あなたも追記修正依頼の場で、指摘されていましたよね? 自分だけ間違ったことはして来ていないかの物言いはやめて下さい
m.ts10806

2019/04/12 00:03 編集

その時の指摘を省みて淡々と質問本文に対する確認と追記修正依頼をコメントしています。指摘してくれた方にはその場で反省の弁を述べていますし、今後繰り返さないようにと今回”初めから”きちんと確認と修正依頼をかけています。 それに一切応じず反論だけしている自身はどうなのでしょうか?自身の目が濁っているだけだと思いませんか? いつ、反論だけしている姿勢を省みて質問に対する確認と追記修正依頼のほうに目を向けてくれますか?
newyee

2019/04/12 00:10

確認事項の表現を修正したのは、何故でしょうか?
m.ts10806

2019/04/12 00:23 編集

反論材料見つけたくてうずうずしているのは分かるのですが落ち着いてください。 見比べればすぐわかります。より正しく意図が伝わるように修正(というか調整)しただけです。 >以前、出典を書く書かないの話しをしていた時、あなたも追記修正依頼の場で、指摘されていましたよね? 自分だけ間違ったことはして来ていないかの物言いはやめて下さい newyeeさん、あなたもs8_chuさんに「ごめんなさい」してきましょう。あれはあなたにも指摘されています。自分だけ間違ったことは以下略
newyee

2019/04/12 00:23

では、お聞きしますが、未就学児がどうこうと言った人をバカにした言い方は正しいと思われますか? そのような言い方をしていては、誰もあなたの意見を聞こうとは思いません。
退会済みユーザー

退会済みユーザー

2019/04/12 00:27

あれこれ言われるのが嫌なら、プログラミング学校へ通ってください。 お金さえ払えばどんなバカでも優しく教えてもらえるはずです。
m.ts10806

2019/04/12 00:31

直接「この程度も理解できないのか、馬鹿かお前は」では伝わらないと思ったので指摘のために例えを出しただけです。結果的にもっと馬鹿にしたように伝わったようですか、それはそれで伝えたかったことなので正しい。 それだけ理解力が未熟であるという指摘です。Kosuke_Shibuyaさんも「受け答えが成立しない」と指摘されていますね。 それに確認と追記修正依頼は意見ではありません。質問本文に対する客観的事実に基づく指摘です。 無視して立場が悪くなるのはむしろ質問者としてのあなたの立場です。 反論材料見つけたくてうずうずしているのは分かるのですが落ち着いてください。
newyee

2019/04/12 00:36

似た者同士痛い所をつかれて、感情的になっているのは分かりますが、そのような発言は自分の醜い心を露呈するだけなので、やめた方がよろしいかと。
m.ts10806

2019/04/12 00:41 編集

どこをどう見たら「痛いところを突いたつもり」なのかわかりませんが、質問に対する追記修正依頼の場であなたは何を仰っていますか?反論材料だけ探してマウント取ろうとするその行為は醜いと思いませんか?ほかのユーザーからの印象を悪くするだけと思いませんか? ”客観的に”を推すのでしたらまず自身を客観的に見てください。 いつ、反論だけしている姿勢を省みて質問に対する確認と追記修正依頼のほうに目を向けてくれますか?
m.ts10806

2019/04/12 00:42 編集

それとも、もっとかみ砕かないとあの10の確認項目が何の確認かすらわかりませんか?でしたらそのように言ってください。無反応ではどこまでわかっているのかわかりません。
newyee

2019/04/12 01:03

まぁあなたには分からないでしょうね。 人をバカにした発言を指摘され、開き直るような人には。
m.ts10806

2019/04/12 01:07

どこをどう見たら開き直ったことになるのか客観的に具体的に説明してください。できないなら適当に発言しないでください。ここは質問に対する追記修正依頼の場です。 それに質問に対する追記修正依頼の場であなたはいつまで何をこだわっていますか?せっかくs8_chuさんが指摘してくれてたのにまだわかりませんか?
m.ts10806

2019/04/12 01:22

mts10806:それとも、もっとかみ砕かないとあの10の確認項目が何の確認かすらわかりませんか?でしたらそのように言ってください。無反応ではどこまでわかっているのかわかりません。 newyee: まぁあなたには分からないでしょうね。 ↑よーく読んでください。受け答えが成立していません。 道端でタクシー拾って「自宅まで」とだけ指示して運転手に「自宅ってどの方面ですか?」と聞かれたのに「あなたには分からないでしょうね(なんで分からないの)」と言っているのと同じ流れです。どっちが上から目線に見えますか?客観的に考えてみてください。 あなたが唯一触れたと思われるのは「確認事項の表現を修正したのは、何故でしょうか?」だけです。 私の確認項目の内容には一切触れていません。それで私の「どこまでわかったの?」という問いに対して「あなたには分からないでしょうね」では会話が成立していません。 それとも「全部わかりません」ということでしょうか。質問に対する追記修正依頼の場であなたはいつまで何をこだわっていますか? いつ、反論だけしている姿勢を省みて質問に対する確認と追記修正依頼のほうに目を向けてくれますか?
newyee

2019/04/12 01:28

「直接「この程度も理解できないのか、馬鹿かお前は」では伝わらないと思ったので指摘のために例えを出しただけです。結果的にもっと馬鹿にしたように伝わったようですか、それはそれで伝えたかったことなので正しい。」 上記のような言い方は、完全に開き直ってますよね。上記書き込みは、完全に人を中傷する内容の書き込みです。まずは、謝罪するべきではないでしょうか。
m.ts10806

2019/04/12 01:46 編集

「完全に開き直ってますよね」は感情的で主観的な意見です。却下。これまでの経緯からあなたには客観的な説明は無理と分かっています。 客観的であるならもっと先に気づくことがありますよね? 謝るのは、あなたが先です。 指摘してくれたs8_chuさんへの謝罪、 赤の他人とペアプロを求めるかのような質問の仕方ばかりをする誤ったteratailの使い方を続けることへの謝罪、 質問者としてあるまじき最初からやさぐれた態度をとった私への謝罪(修正依頼に全く応じず枝葉の反論ばかり続ける姿勢の反省と謝罪)、 「ペアで対応することが分かって」いながら質問本文でpassword_verify()について触れずにmaisumakunさんにpassword_verify()について触れさせたことへの謝罪、 解決済みとしながらどう解決したか一切コメントしないことへの謝罪、 ここまでできてようやく私があなたを馬鹿にしたことへの謝罪が必要か否かの検討が可能になります。 もしmaisumakunさんの回答や私のコメントにより「ペアで対応することが分かっ”た”」のであれば、そもそもpassword_hash()について何も調べずに試さずにデバッグもせずに使っていたことになるので、どちらにせよ丸投げです。
m.ts10806

2019/04/12 02:06

>ここまでできてようやく私があなたを馬鹿にしたことへの謝罪が必要か否かの検討が可能になります まあここまで言う必要はなかったかな。 状況を理解させるためとはいえ、多少言いすぎた感はありますね。失礼しました。 次はあなたですね。謝罪すべきことをきちんと精査して謝罪し、質問本文への確認・追記修正依頼に応える番です。
newyee

2019/04/20 11:12

諸事情で、返信遅れました。 まぁ確かに自分も、質問内容に関して不備があったとは思います。その点は失礼しました。
m.ts10806

2019/04/20 11:16

はい。あくまで問題解決の場なのでそこは私も含めユーザー同士見失わないようにしたいところですね
guest

回答1

0

ベストアンサー

名前とパスワードを指定して、データベースから値を取得することができず、データベースに入っているデータとの照合ができません。

条件を名前だけでデータベースから抽出して、password_vefifyPHPマニュアル)で正しいか検証してください。

投稿2019/04/11 11:15

maisumakun

総合スコア145121

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問