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

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

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

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

PHP

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

Q&A

解決済

1回答

7050閲覧

password_verifyがfalseになる。

atsupoooon

総合スコア47

MySQL

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

PHP

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

0グッド

1クリップ

投稿2018/04/30 04:55

編集2018/04/30 13:43

PHP:5.6
ログイン機能を実装しているのですが、password_verifyがfalseになって認証が通らない原因がわかりません。

Mysql側には、ハッシュ化されたパスワードを保存しているのですが。。
ハッシュは、password_hashで実装。

2.3で必要な情報は取得できているのですが、password_verifyだけがfalseになります。

password_verifyで認証が通らない原因わかりますでしょうか。
お教え頂ければと思います。

login.php

dbconnetct.php

1<? 2// エラー設定 3ini_set( 'display_errors', 1 ); 4 5// セッションの開始 6session_start(); 7 8class connect { 9 //定数の宣言 10 const DB_NAME=''; 11 const HOST=''; 12 const UTF=''; 13 const USER=''; 14 const PASS=''; 15 //データベースに接続する関数 16 function pdo(){ 17 $dsn="mysql:dbname=".self::DB_NAME.";host=".self::HOST.";charset=".self::UTF; 18 $user=self::USER; 19 $pass=self::PASS; 20 try{ 21 $pdo=new PDO($dsn,$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.SELF::UTF)); 22 }catch(Exception $e){ 23 echo 'error' .$e->getMesseage; 24 die(); 25 } 26 //エラーを表示してくれる。 27 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 28 return $pdo; 29 } 30 //SELECT文のときに使用する関数。 31 function select($sql){ 32 $data=$this->pdo(); 33 $stmt=$data->query($sql); 34 $items=$stmt->fetchAll(PDO::FETCH_ASSOC); 35 return $items; 36 } 37 //SELECT,INSERT,UPDATE,DELETE文の時に使用する関数。 38 function plural($sql,$item){ 39 $data=$this->pdo(); 40 $stmt=$data->prepare($sql); 41 $stmt->execute(array(':id'=>$item)); 42 return $stmt; 43 } 44} 45 46 47 48;?> 49

php

1$result 2array(1) { [0]=> array(2) { ["username"]=> string(4) "5555" ["password"]=> string(60) "$2y$10$eHJnG0nuxKetZM9dV8NxNuUl2dz417DBtAdQuX29NNrYURpJa5Eoi" } } 3 4$result[0] 5array(1) { [0]=> array(2) { ["username"]=> string(4) "5555" ["password"]=> string(60) "$2y$10$eHJnG0nuxKetZM9dV8NxNuUl2dz417DBtAdQuX29NNrYURpJa5Eoi" } } 6

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

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

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

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

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

vapordog

2018/04/30 08:02

var_dump(password_verify($password, $hash_pass));の辺で、 var_dump(password_hash($password, PASSWORD_DEFAULT)); var_dump($row['password']); とでもして同じものかどうかを確認してみてはいかがでしょうか。ご掲載のPHPには問題無いように見受けられます。
atsupoooon

2018/04/30 08:45 編集

ご回答ありがとうございます。 2つとも違う値が表示されませう。 そもそもなのですがpassword_hashは、第1引数によって毎回変わるものだと認識しておりますが。。 違うのでしょうか?? $row['password'];では、DBに格納されている指定のhashのパスワードは取得確認できております。
vapordog

2018/04/30 09:49

上記複数回実行して値変わりますか?
atsupoooon

2018/04/30 09:59 編集

var_dump(password_hash($password, PASSWORD_DEFAULT)); var_dump($row['password']); 上記で確認したところ、 password_hash のstring(60) hash値 $row['password'] のstring(60) hash値 と言う形で返ってきましたが、password_hashの値はブラウザを更新する度に、値が変更されます。
vapordog

2018/04/30 11:31 編集

すいません。今確認しましたが変わるんですね。確かめようがないのか。てことは、password_verifyを信じて、①パスワードが間違っている?②パスワードを保存した時のデータが間違っているですかね
atsupoooon

2018/04/30 11:42 編集

そうなんです。。。ローカル環境でパスワードも1111などかなり簡易的なもので試してみましたが、ダメでした。insertする際に、不要な文字や数値などが入る場合ありますでしょうか。後ほどinsertする時の記述も追記致します。
guest

回答1

0

ベストアンサー

コードを絞って確認してみました。
DB から正しく値が取れていれば、結果には問題ないようです。

$result の中身が正しいか確認してください。

php

1<?php 2$username = 'username'; 3$password = 'hoge'; 4$result = [ 5 0 => [ 6 'username' => 'username', 7 'password' => '$2y$10$BZmFUSp94Y0ZqKzRmuBwV.sKDtGlVD9kjX0f/FGn1griSgtiybqsi', 8 ], 9]; 10 11if (!empty($username) && !empty($password)) { 12 foreach ($result as $row) { 13 $hash_pass = $row['password']; 14 } 15 var_export(password_verify($password, $hash_pass)); 16 var_export($row['password']); 17 18 if (password_verify($password, $row['password'])) { 19 echo 'success'; 20 } else { 21 echo "ユーザ名またはパスワードが間違っております。"; 22 } 23} 24

このスクリプトはセキュリティ観点でに会員管理スクリプトとして使用してはダメです。

・dbconnect.php の作りがかなりおかしいです。
・構造的に SQL インジェクションの対策が取れません。
以下を参照しながら、設計し直してください。
PHPでデータベースに接続するときのまとめ

他に気になったのは
if (password_verify($password, $row['password'])) {$row['password']$hash_passを使用してください。
foreach ($result as $row) {は結果を一行だけ取得し、$result[0]とすれば良いです。
<!DOCTYPE html>の前にechoは無しです。

以下もあわせて読むと良いです。
$_GET, $_POSTなどを受け取る際の処理

追記
DB のデータの検証の方法

$password = 'hoge'; $result = [ 0 => [ 'username' => 'username', 'password' => '$2y$10$BZmFUSp94Y0ZqKzRmuBwV.sKDtGlVD9kjX0f/FGn1griSgtiybqsi', ], ];

の箇所を

php

1$password = 'パスワード'; 2$result = [ 3 0 => [ 4 'username' => 'username', 5 'password' => '$2y$10$eHJnG0nuxKetZM9dV8NxNuUl2dz417DBtAdQuX29NNrYURpJa5Eoi', 6 ], 7];

とすることで、検証できます。

投稿2018/04/30 12:17

編集2018/05/01 14:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

atsupoooon

2018/04/30 12:34

ご指摘ありがとうございます。 いただきましたURLを参照して、勉強していきます。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/04/30 13:10

先にちゃんと今回の件、原因を確認したほうが良いです。 $result は、回答のサンプルのようになっていましたか?
atsupoooon

2018/04/30 13:46 編集

$resultの結果とSQLの部分ですが、確認するために質問文に追記しました。 結果としては、取得したいDBのpasswordの値を取得できておりました。 しかし、認証が通りません。。。 一度、見て頂ければ幸いです。 お願いいたします。
退会済みユーザー

退会済みユーザー

2018/04/30 14:04

回答の値を変更することで、検証できます。 $password と $result['password'] を変更してみてください。
atsupoooon

2018/05/01 14:08

$passwordは、入力された値の部分ですよね? $result['password']は、どこの記述のことでしょうか。 $passwordを$result['password']に変更と言うことでしょうか。
退会済みユーザー

退会済みユーザー

2018/05/01 14:12

回答に追記しました。
atsupoooon

2018/05/01 14:49

ありがとうございます。 確認できました。 $resultを固定の値で入れると認証が通りましたので、 $resultの値がおかしいですね。
atsupoooon

2018/05/01 14:54

DBやクラスなど諸々設計の変更が必要になるみたいなので、 一旦ゼロから作って行こうと思います。 DBの設計・クラス化・セキュリティで参考になるサイトなどありますでしょうか。 度々申し訳ございません。
退会済みユーザー

退会済みユーザー

2018/05/01 15:02

基本的に、会員管理が必要となる場合は、フレームワークやライブラリ等を使用して、フルスクラッチで作成することはありません。 学習用であれば、以下の記事がワリと丁寧に説明しています。 https://qiita.com/ShibuyaKosuke/items/f114ffccf441edb2b745
atsupoooon

2018/05/01 18:44

ありがとうございます。 やはりそうですよね。 勉強をし直したいと思ってゼロから書いて行こうと思ってました。 いろいろとお教えいただきありがとうございます。 また、ご相談させていただくことがあればよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問