解決した
登録フォームに奇妙な問題がありました。JS は奇妙なことをしていて、ログイン時に password_verify が機能していたとしても、場合によってはハッシュが異なっていました... コードを修正したところ、動作するようになりました! みんなありがとう!
解決した
password_verify コードが 4 日間も機能しない理由を真剣に理解しようとしていますが、本当に混乱して怒っています...
まず、セッションはすでに開始されており、他のすべては問題なく動作していると言わざるを得ません。
しかし、password_verify スクリプトを作成しようとすると、まだ false が返されます...
データベースのフィールドに名前が付けられpassword
、に設定されていvarchar 255
ます。
データベースからのパスワードは次のようになります。
$2y$10$GEw0Ie6r/Udz2hgJVkCy.ut99NY5NE.h8LEvNM1gBizA1tY58iNa6
いいですよね、こうあるべきですよね…
そして、自分のページでデータベースのパスワードをエコーすると、同じように表示されるので、良いです。しかし、私がするとpassword_verify
、うまくいきません。それpassword_verify
は間違っていることを示しています...フォームに入力しているパスワードが正しく、dbパスワードと一致することを100%確信しているため、その理由はわかりません。ただし、機能せず、「DONE」がエコーされません。
echo strlen
60を示しています
echo $dbpassword
ハッシュされたデータベースのパスワードを示します。
echo $passwordsubmitted
フォームから通常入力されたパスワードを表示します。
<?php
if(isset($_POST['changepassword'])){
if($_POST['username'] !== $_SESSION['username']){
echo "Invalid username";
}
else{
$stmtselectvalues = $mysqli->prepare("SELECT password FROM members WHERE username = ?");
$stmtselectvalues->bind_param('s',$_SESSION['username']);
$stmtselectvalues->execute();
$stmtselectvalues->bind_result($dbpassword);
$stmtselectvalues->store_result();
while($stmtselectvalues->fetch()){
$passwordsubmitted = $_POST['password'];
echo strlen($dbpassword)."<p>";
echo "Submitted password: ".$passwordsubmitted." and password from database: ".$dbpassword."<p>";
if(password_verify($passwordsubmitted, $dbpassword) == false){
echo "Invalid Password";
}
else{
echo "DONE!";
}
}
}
}
?>
<center>
<form method='POST'>
Username: <input type='text' name='username'><br>
Password: <input type='text' name='password'><br>
<input type='submit' name='changepassword'><br>
</form>
しかし、このコードを使用すると、動作し、エコーが「DONE」になるため、password_verify が true であることを意味します...
<?php
if(isset($_POST['changepassword'])){
if($_POST['username'] !== $_SESSION['username']){
echo "Invalid username";
}
else{
$dbpassword = password_hash("test", PASSWORD_BCRYPT);
$passwordsubmitted = $_POST['password'];
echo strlen($dbpassword)."<p>";
echo "Submitted password: ".$passwordsubmitted." and password from database: ".$dbpassword."<p>";
if(password_verify($passwordsubmitted, $dbpassword) == false){
echo "Invalid Password";
}
else{
echo "DONE!";
}
}
}
?>
<center>
<form method='POST'>
Username: <input type='text' name='username'><br>
Password: <input type='text' name='password'><br>
<input type='submit' name='changepassword'><br>
</form>
なぜこれが起こっているのか本当にわかりません。助言がありますか?
UPDATE
登録入力は<input type='password' name='password'>
登録から送信されたパスワードは、次のコードでハッシュされます。
$password = $_POST['password'];
$passwordhash = password_hash($password, PASSWORD_BCRYPT);