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

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

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

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

Q&A

解決済

3回答

1692閲覧

phpのpassword_verify()が機能しない

nguyenseiji

総合スコア156

PHP

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

0グッド

0クリップ

投稿2020/09/16 12:24

編集2020/09/16 12:25

password_verify()がうまく機能しないです
コードの記載方法は合っているはずなのですが
if文でpassword_verify()がtrueの場合はログイン処理をしております
ちなみにpassword_hash()はうまく処理できています
新規でアカウントを作成する際とログインのみの2通りがあります

ログイン確認ファイル

php

1<!DOCTYPE HTML> 2<html lang="jp"> 3 4<head> 5</head> 6 7<body> 8 <!-- 初期化 --> 9 <?php 10 11 try{ 12 require_once("../../../../confidential/detabaseAccses.php"); 13 14 $checkUserName = $_POST["userName"]; 15 $aleadyHashPassword = $_POST["aleadyHashPassword"]; 16 17 18 19 20if(!empty($_POST["unEncodePassword"])){ 21 $needHashPassword = $_POST["unEncodePassword"]; 22 $aleadyHashPassword = password_hash($needHashPassword, PASSWORD_DEFAULT); 23} 24 25 //DBからログイン情報が合っているか確認 26 $stmt = $dbh->prepare('SELECT * FROM user WHERE userName = ? AND password = ?'); 27 $stmt->bindValue(1,$checkUserName,PDO::PARAM_STR); 28 $stmt->bindValue(2,$aleadyHashPassword,PDO::PARAM_STR); 29 $stmt->execute(); 30 31 foreach($stmt as $rec){ 32 33 $userName = $rec["userName"]; 34 $password = $rec["password"]; 35 36 } 37 38 39 if(password_verify($aleadyHashPassword, $password)) { 40 41 session_start(); 42 $_SESSION["login"] = 1; 43 $_SESSION["userName"] = $userName; 44 header('Location:../../../../shop/hagoli/salesPage/mainPage/main/mainPage.php'); 45 46 47 48 }else { 49 print 'ユーザー名またはパスワードが間違っています'; 50 print '<a href = "../../../../shop/hagoli/salesPage/mainPage/main/mainPage.php"><button>HAGOLI</button></a>'; 51 } 52 53 }catch(PDOException $e){ 54 print "只今メンテナンス中の為、ご迷惑をお掛けしております"; 55 die(); 56 } 57 58 ?> 59 60</body> 61 62</html>

新規アカウント作成ファイル

php

1<!DOCTYPE HTML> 2<html lang="jp"> 3 4<head> 5 <meta charset="utf-8"> 6</head> 7 8<body> 9<!-- 初期化 --> 10 <?php 11 12 try{ 13 14 require_once("../../../../confidential/detabaseAccses.php"); 15 16//POSTの受け取り 17 $userName = $_POST["userName"]; 18 $password = $_POST["password"]; 19 20 21 $email = $_POST["email"]; 22 $phoneNumber = $_POST["phoneNumber"]; 23 $fullName = $_POST["fullName"]; 24 $postalCode = $_POST["postalCode"]; 25 $streetAddress = $_POST["streetAddress"]; 26 27 $year = $_POST["year"]; 28 $month = $_POST["month"]; 29 $day = $_POST["day"]; 30 31 $sex = $_POST["sex"]; 32 33 34//DBへのアカウント登録 35 36$passwordHash = password_hash($password, PASSWORD_DEFAULT); 37 38 39 40 $stmt = $dbh->prepare('INSERT INTO user (userName,password,email,phoneNumber,fullName,postalCode,streetAddress,year,month,day,sex) values(?,?,?,?,?,?,?,?,?,?,?)'); 41 $stmt->bindValue(1,$userName,PDO::PARAM_STR); 42 $stmt->bindValue(2,$passwordHash,PDO::PARAM_STR); 43 44 $stmt->bindValue(3,$email,PDO::PARAM_STR); 45 $stmt->bindValue(4,$phoneNumber,PDO::PARAM_INT); 46 $stmt->bindValue(5,$fullName,PDO::PARAM_STR); 47 $stmt->bindValue(6,$postalCode,PDO::PARAM_INT); 48 $stmt->bindValue(7,$streetAddress,PDO::PARAM_STR); 49 50 $stmt->bindValue(8,$year,PDO::PARAM_INT); 51 $stmt->bindValue(9,$month,PDO::PARAM_INT); 52 $stmt->bindValue(10,$day,PDO::PARAM_INT); 53 $stmt->bindValue(11,$sex,PDO::PARAM_STR); 54 $stmt->execute(); 55 56//そのままログイン処理 57 $eot = <<< EOM 58 <form method="POST" name="moveTo" action="../../login/main/checkLogin.php"> 59 <input type="hidden" value="$userName" name="userName"> 60 <input type="hidden" value="$password" name="aleadyHashPassword"> 61 </form> 62 63 <script language="javascript" type="text/javascript"> 64 function moveTocheckLogin(){ 65 document.moveTo.submit(); 66 } 67 moveTocheckLogin() 68 </script> 69EOM; 70 echo $eot; 71 //その他 72 }catch(PDOException $e){ 73 print "只今メンテナンス中の為大変ご迷惑をお掛けしております"; 74 die(); 75 } 76 ?> 77 78 79 80 81</body> 82 83</html> 84 85 86 87

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

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

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

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

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

guest

回答3

0

ベストアンサー

コードの記載方法は合っているはずなのですが

いや、組み方違います。
SELECT時にhash使いません。
idなどキーとなる情報1つのみで検索して取得してきた結果をpassword_verify ()でチェックします。

検証はしてないけど、こういう感じ。

php

1$stmt = $dbh->prepare('SELECT * FROM user WHERE userName = ?'); 2$stmt->bindValue(1,$checkUserName,PDO::PARAM_STR); 3$stmt->execute(); 4$result = $stmt->fetch(PDO::FETCH_ASSOC); 5 6if($result && password_verify($password,$result['password']) ){ 7 //OK 8}else{ 9 //NG 10} 11

$password はフォーム送信されたパスワード。

下記のような記事は参考にしてください。
PHPによる簡単なログイン認証いろいろ
PHPログイン機能サンプル

投稿2020/09/16 12:40

m.ts10806

総合スコア80875

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

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

nguyenseiji

2020/09/16 13:34 編集

ログインチェックファイルのみ修正いたしましたがやはりif文でfalseになります $checkUserName = $_POST["userName"]; if(!empty($_POST["aleadyHashPassword"])){ $aleadyHashPassword = $_POST["aleadyHashPassword"]; } if(!empty($_POST["unEncodePassword"])){ $needHashPassword = $_POST["unEncodePassword"]; } //DBからログイン情報が合っているか確認 $stmt = $dbh->prepare('SELECT * FROM user WHERE userName = ? '); $stmt->bindValue(1,$checkUserName,PDO::PARAM_STR); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); if($result && password_verify($aleadyHashPassword,$result['password']) ){ session_start(); $_SESSION["login"] = 1; $_SESSION["userName"] = $checkUserName ; header('Location:../../../../shop/hagoli/salesPage/mainPage/main/mainPage.php'); }else{ print 'ユーザー名またはパスワードが間違っています'; print '<a href = "../../../../shop/hagoli/salesPage/mainPage/main/mainPage.php"><button>HAGOLI</button></a>'; }
nguyenseiji

2020/09/16 13:14 編集

新規作成からですとうまくログインできるのですが やはりログインからですとログイン処理がうまく機能しないです 多分パスワードが一致しないのかと思いますが どこでミスをしているのか全く見当がつきません 教えて頂けると助かります
m.ts10806

2020/09/16 13:20

回答読んでないのが非常に良く分かります。
nguyenseiji

2020/09/16 13:33

すいません 上記のコードで解決しました 発想がそもそも間違えていたので本当に助かりました ありがとうございます。
m.ts10806

2020/09/16 13:37

コードを理解せずに雑に対応しているのが良く分かりました。 どれだけ時間がたっても組めるようにはなりません。 どうなりたいのか知りませんが、雑にしかできない人はちょっと考えた方がいいですよ。やり方も、今後も。
guest

0

if(password_verify($aleadyHashPassword, $password)) {

ココ。
password_verifyはrawとhashを引数に渡しましょう。

投稿2020/09/16 12:33

hentaiman

総合スコア6426

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

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

0

password_verifyにも記載されているように、password_verifyは第一引数に素のパスワード、第二引数にハッシュ化されたパスワードを代入します。
パッとみたところ両方ともハッシュ化しているので、それが原因ではないでしょうか?

投稿2020/09/16 12:32

yuuyu

総合スコア1139

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問