使用准备好的语句从 MySQL 数据库验证散列密码
Verify hashed passwords from MySQL database using Prepared Statements
我正在尝试使用 password_hash()
和 password_verify()
函数从我的 MySQL 数据库验证我的用户的散列密码。我正在尝试使用准备好的 PHP 语句来执行此操作以增加安全性但没有运气。有人知道为什么吗?
代码如下:
//check if password is linked to username
$checkpass = $conn->prepare("SELECT user_password FROM user_details WHERE user_password=?");
$checkpass->bind_param("s", $preppass);
$preppass = $password;
$getpass = $checkpass->execute();
//get and check result
$checkpass->bind_result($getpass);
$checkpass->fetch();
if (!password_verify($password, $getpass)) {
echo "<script>console.log('Incorrect username or password!')</script>";
return false;
exit;
}
echo "S<script>console.log('Successfully logged in!')</script>";
$conn->close();
这是数据库:
Database Layout
我尝试过的:
非常感谢您对此提供帮助。
非常感谢!
因为您准备的 SQL 语句正在使用 ?
(WHERE user_password=?"
),看起来 $checkpass->bind_param("s", $preppass);
正试图将 $prepass
绑定到参数 :s
不存在。
要么使用 WHERE user_password=:s"
(声明命名语句参数),要么使用 $checkpass->bind_param(1, $preppass);
(将普通密码绑定到语句中的第一个 ?
)。
您必须使用用户名而不是密码来查找散列密码,因为您不知道散列密码是什么。然后使用 password_verify()
检查输入的密码是否与散列密码匹配。
$checkpass = $conn->prepare("SELECT user_password FROM user_details WHERE username=?");
$checkpass->bind_param("s", $username);
$checkpass->execute();
//get and check result
$checkpass->bind_result($getpass);
$checkpass->fetch();
if (!password_verify($password, $getpass)) {
echo "<script>console.log('Incorrect username or password!')</script>";
return false;
exit;
}
echo "S<script>console.log('Successfully logged in!')</script>";
$conn->close();
我正在尝试使用 password_hash()
和 password_verify()
函数从我的 MySQL 数据库验证我的用户的散列密码。我正在尝试使用准备好的 PHP 语句来执行此操作以增加安全性但没有运气。有人知道为什么吗?
代码如下:
//check if password is linked to username
$checkpass = $conn->prepare("SELECT user_password FROM user_details WHERE user_password=?");
$checkpass->bind_param("s", $preppass);
$preppass = $password;
$getpass = $checkpass->execute();
//get and check result
$checkpass->bind_result($getpass);
$checkpass->fetch();
if (!password_verify($password, $getpass)) {
echo "<script>console.log('Incorrect username or password!')</script>";
return false;
exit;
}
echo "S<script>console.log('Successfully logged in!')</script>";
$conn->close();
这是数据库:
Database Layout
我尝试过的:
非常感谢您对此提供帮助。
非常感谢!
因为您准备的 SQL 语句正在使用 ?
(WHERE user_password=?"
),看起来 $checkpass->bind_param("s", $preppass);
正试图将 $prepass
绑定到参数 :s
不存在。
要么使用 WHERE user_password=:s"
(声明命名语句参数),要么使用 $checkpass->bind_param(1, $preppass);
(将普通密码绑定到语句中的第一个 ?
)。
您必须使用用户名而不是密码来查找散列密码,因为您不知道散列密码是什么。然后使用 password_verify()
检查输入的密码是否与散列密码匹配。
$checkpass = $conn->prepare("SELECT user_password FROM user_details WHERE username=?");
$checkpass->bind_param("s", $username);
$checkpass->execute();
//get and check result
$checkpass->bind_result($getpass);
$checkpass->fetch();
if (!password_verify($password, $getpass)) {
echo "<script>console.log('Incorrect username or password!')</script>";
return false;
exit;
}
echo "S<script>console.log('Successfully logged in!')</script>";
$conn->close();