下記で動作テストしてみました。
$nama = filter_input(INPUT_POST,password); $hash = password_hash(filter_input(INPUT_POST,password),PASSWORD_DEFAULT); $result = password_verify($nama,$hash); echo '生パス:'.$nama .'<br />'; echo 'ハッシュ:'.$hash .'<br />'; var_dump($result);
結果はbool(true)です。
しかし、実際にDBにあるハッシュ化されたパスワードと生パスを比較するとfalseになってしまいます。
原因は何が考えられますでしょうか?
実際の記述です。
<?php $email = filter_input(INPUT_POST,email); $password = filter_input(INPUT_POST,password); $sql = "SELECT * FROM user_data WHERE email = ? AND password = ?"; $stmt = $pdo->prepare($sql); $stmt->execute([ $email, $password ]); $hitdata =$stmt->fetch(); if(isset($email) && isset($password)) { if($email === $hitdata[email] && password_verify($password,$hitdata[password]) ){ $_SESSION['email'] = h(filter_input(INPUT_POST,email)); header('Location: login1.php'); } else { $messe = "ログインできませんでした"; } } ?> <form action="" method="post"> <p>E-mail</p> <input type="email" name="email" id="email" value="<?php echo h(filter_input(INPUT_POST,email)); ?>"/ maxlength="255"> <p>Password</p> <input type="password" name="password" id="password" value="<?php echo h(filter_input(INPUT_POST,password)); ?>" maxlength="255" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}" title="6文字以上で1文字以上の数字、小文字アルファベット、大文字アルファベットがそれぞれ含まれていること"> <p><input type="checkbox" id="save" name="save" value="on" />次回からは自動的にログインする</p> <input type="submit" value="ログイン"> <br /> <?php echo $messe ?> </form>
多分、
echo $hitdata['email'];
echo $hitdata['password'];
で何も出力されないので
$sql = "SELECT * FROM user_data WHERE email = ? AND password = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([
$email,
$password
]);
のところで
password = ?
が
password = 生パスワード
になっているのでデータがヒットしていないから
echo $hitdata['email'];
echo $hitdata['password'];
に何も入っていないと思うのですが、
こういう場合どうしたらよろしいでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/01 06:56
退会済みユーザー
2016/07/01 06:56
2016/07/01 06:56