demilio
@demilio

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

正しいパスワードを入力したのにログインできない

Q&A

解決したいこと

ある教材を使用してphpを勉強しています。
ログイン画面を作成しているのですが、正しいパスワードを入力してもログインできません。
ログインできるようにしたいです。

コードはほとんど教材通りですが、
暗号化の部分だけmd5(教材)からpassword_hash()に変更しました。
password_hashの場合何かコードを修正すべきなのでしょうか。

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

### 

<body>

<div class="staff-mgn">
<div class="staff-dsp">
    
<h2>スタッフログイン</h2>
<form method="post" action="staff_login_check.php">
<div class="inport-list">
<h3>スタッフコード</h3>
<input type="text" name="code" >
</div>
<div class="inport-list">
<h3>パスワード</h3>
<input type="password" name="pass">
</div>

<input type="submit" value="ログイン">
</form>

</div>
</div>
</body>
<?php

try
{
	require_once('../common/common.php');

	$post=sanitize($_POST);
	
$staff_code=$post['code'];
$staff_pass=$post['pass'];



$staff_pass=password_hash($staff_pass, PASSWORD_DEFAULT);

$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$sql='SELECT name FROM mng_staff WHERE code=? AND password=?';
$stmt=$dbh->prepare($sql);
$data[]=$staff_code;
$data[]=$staff_pass;
$stmt->execute($data);

$dbh=null;

$rec=$stmt->fetch(PDO::FETCH_ASSOC);

if($rec==false)
{
	print '<p>スタッフコードかパスワードが間違っています。</p>';
	print '<div class="btn"><a href="staff_login.html"> 戻る</a></div>';
}
else{
	session_start();
	$_SESSION['login']=1;
	$_SESSION['staff_code']=$staff_code;
	$_SESSION['staff_name']=$rec['name'];
	header('Location:staff_top.php');
	exit();
}



}
catch(Exception $e)
{
	print 'ただいま障害により大変ご迷惑をお掛けしております。';
	exit();
}

?>

自分で試したこと

【試したこと1】
 md5で試したところ正常にログインできました。

【試したこと2】
 調べによるとpassword_hashの場合、パスワードの長さを60以上に設定しなければならないとあったので、
 60以上に設定しました。
 結果は変わりませんでした。

0

1Answer

password_hash関数は同じパスワードでも
毎回違うハッシュ値を返すのでDBの値と一致しません。

$password = 'test-password';

password_hash($password, PASSWORD_DEFAULT);
// "$2y$10$AypxB3FGgustIJZr2hjSk.NtdK5xK4.QWpxg1nu7lzdWBOrm6BFRm"

password_hash($password, PASSWORD_DEFAULT);
// "$2y$10$IZmaIjuuVTLbgCyLmhJNqOUpJWyZWCARrRs8KDifoYAqerbHYWFi6"

password_hash($password, PASSWORD_DEFAULT);
// "$2y$10$jmPqiTEaqRjErIB.aqCrBup.aZXWxdKFv52Xc8vZPYk6mSis09fs."

SQLのWHERE句からpasswordを消してcodeのみで検索を行いヒットした結果から
password_verify関数でパスワードをチェックすれば良いと思います。

またDBに登録されているパスワードはmd5で生成されたハッシュ値だと思いますのでpassword_hashでパスワードを作り直す必要もあると思います。

qiitaに良い記事がありましたのでこちらを参考にすると良いと思います。
https://qiita.com/MasaKu_n/items/51552aa0331f3ae90dae

2Like

Comments

  1. @demilio

    Questioner

    ご丁寧な解説ありがとうございます。
    解決致しました。

Your answer might help someone💌