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

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

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

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

Q&A

解決済

2回答

417閲覧

password_verfyでの認証について教えて下さい

higurin1969

総合スコア14

PHP

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

0グッド

3クリップ

投稿2018/12/25 07:46

編集2018/12/25 09:08

前提・実現したいこと

phpで認証ページの作成をしております。
事前にID,PASSWORDを登録し、ログイン時に
PASSWORD認証しようとしています。

発生している問題・エラーメッセージ

事前に登録してハッシュ化したPASSWORDとログイン時の生PASSWORDを
password_verify()で比較しようとしてもfaultになります。

該当のソースコード

$passwd = $_POST['passwd'];//passはxyz123 (中略) $hash = password_hash($passwd , PASSWORD_DEFAULT);//hashを作成 (中略) $query = "INSERT INTO id (email , passwd) VALUES ('$id','$hash')";//DBに登録 ・ ・ ・ $hash_pass = $row['passwd']; if(password_verify($passwd, $hash_pass) === TRUE){ print '認証成功'; print ''; }else{ print '認証失敗'; 認証失敗と出力されます

試したこと

$hash_pass = '$2y$10$/GA8dDZh1gFD9yVJFl48eu3gDFuot5bpnRrRNb78jt52SaazbY55C';//最初にxyz123で登録したときのハッシュ
$correct_password = 'abc123'; //
var_dump(password_verify($correct_password, $hash_pass));

$incorrect_password = 'xyz123'; //
var_dump(password_verify($incorrect_password, $hash_pass));

実行結果
bool(false) bool(false)

補足情報(FW/ツールのバージョンなど)

phpのバージョンは7.2.6です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/12/25 07:53

password_verify な、、
m.ts10806

2018/12/25 07:58

faultでは「欠陥・欠点」になるので意味が違うと思います(細かいですが)
m.ts10806

2018/12/25 08:00

; //最初に  ↑ここに全角が入っているのでコピペではただしく再現できません。 コードはマークダウンのcode機能をご利用ください。
higurin1969

2018/12/25 08:26

m6u様、mts10809様 タイピングミスすみません。以後気を付けます。
m.ts10806

2018/12/25 08:27

質問は編集できますので適宜ご対応ください
guest

回答2

0

passwdカラムの桁数足りてますか?
PHPマニュアルには下記のようにあります。

これを指定したときの結果の長さは、変わる可能性があります。 したがって、結果をデータベースに格納するときにはカラム幅を 60 文字以上にできるようなカラムを使うことをお勧めします (255 文字くらいが適切でしょう)。

下記のようにした場合、2つ目は何度実行しても必ずbool(true)と出力されるので、値が全て入っていないか余計な情報(空白とか)が付加されて保存されているのではないかと推察します。

php

1<?php 2$hash = password_hash('xyz123' , PASSWORD_DEFAULT); 3echo $hash."\n"; 4$hash_pass = $hash; 5$correct_password = 'abc123'; // 6var_dump(password_verify($correct_password, $hash_pass)); 7 8$incorrect_password = 'xyz123'; // 9var_dump(password_verify($incorrect_password, $hash_pass));

念のためtrim()なども試してみてください(本来はすべきではないですが)

それか生の値を放り込むのではなくプリペアドステートメントで値を更新するか。

投稿2018/12/25 08:07

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2018/12/25 08:17

correct? incorrect? 逆や、逆!
higurin1969

2018/12/25 08:36

mts10806様 DBのカラムはvarchar(255) utf8_unicode_ciです。
higurin1969

2018/12/25 08:39

m6u様 逆の意味わかりました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/12/25 08:41

hash化すると$とか出てくるので、ちょっときな臭いから SQL文をprepare()しつつexecute()する方法が良さげ。
m.ts10806

2018/12/25 08:43

質問者さん では回答の最後に提示した内容で保存処理を調整してください
guest

0

自己解決

皆様、ご協力ありがとうございました。
trim()を使って保存しましたら
if(password_verify($passwd, $hash_pass)){
print '認証成功';
}else{
print '認証失敗';
}
で認証成功と出力されました。
どっかに余分な空白があったみたいです。
お騒がせしまして申し訳ございませんでした。
DBへの保存方法も、もう少し勉強してまた分からないことがありましたら
質問させて頂きます。

ありがとうございました。

投稿2018/12/25 09:01

編集2018/12/25 09:07
higurin1969

総合スコア14

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

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

m.ts10806

2018/12/25 11:09 編集

すみません。低評価しました。 「すべきではない」と補足しました通り、問題切り分けだけのための一時対応であることをご理解ください。 trimを利用するということはデータを加工するとイコールになります。画面表示時にhtmlエスケープをするのであればともかくパスワード照合で加工するのは大NGです。 なのでこの回答をベストアンサーとするのはセキュリティ観点からもNGという考えです。後から見た同じ問題を抱えた人に間違った情報を与えることになります(ベストアンサーとはそれだけ効力を持ちます) 私もコメントをくれたm6uさんもデータ保存方法を変更するように書いてますよね。 回答を修正されるかベストアンサーを取り消されるようつよくすすめます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問