php - PDO 准备好的语句和密码散列?
问题描述
我查看了整个互联网以尝试解决这个问题,但我无法为我的生活找到答案。真的开始放弃了。
所以基本上每当我使用正确的电子邮件和正确的密码登录时,它都会显示错误的电子邮件或密码。这只发生在我在数据库中散列密码时
电子邮件:test@gmail.com
密码:testtest
哈希:$2y$10$hk3d/GyYvImcxYR.vdC2/.JDIeQeXyKdTSPifueAkQNrYVBcMn1Yi
无论如何,如果有人可以帮助我,那将是我的login.php代码。
<?php
require "../private/php/autoload.php";
$error = "";
if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_SESSION['token']) && isset($_POST['token']) && $_SESSION['token'] == $_POST['token']){
$email = $_POST['email'];
if(!preg_match("/^[\w\-]+@[\w\-]+.[\w\-]+$/", $email)){
$error = "Please enter a valid email.";
}
$password = $_POST['password'];
if ($error == ""){
$arr['email'] = $email;
$arr['password'] = $password;
$query = "SELECT * FROM users WHERE email = :email && password = :password LIMIT 1";
$stm = $conn->prepare($query);
$check = $stm->execute($arr);
if($check){
$data = $stm->fetchAll(PDO::FETCH_OBJ);
if(is_array($data) && count($data) > 0){
$data = $data[0];
if (password_verify($_POST['password'], $data->password)){
$_SESSION['username'] = $data->username;
$_SESSION['user_id'] = $data->user_id;
header("Location: index.php");
die;
}
}
}
}
$error = "Wrong email or password!";
}
$_SESSION['token'] = get_random_string(30);
?>```
解决方案
您的 MySQL 表包含哈希密码,但您通过未哈希密码查询它,这就是它目前不匹配/工作的原因。
此外,值得注意的是,从安全的角度来看,这可能很糟糕,因为正在传输明文密码,并且很容易出现在您的 MySQL 日志中(慢日志、错误,如果有任何问题等)。
将查询换出以仅查找电子邮件地址(假设它是唯一的),然后验证您的 PHP 逻辑中的密码哈希是否与 MySQL 结果匹配。
推荐阅读
- multithreading - 延迟初始化和可变静态借用 [Rust]
- git - 在 git diff 中,我可以只显示没有添加的删除吗?
- ruby - 为什么/如何`gem fetch -s $source`与Bundler的`source`语句不同?
- ssl - twilio 为有效的 ssl 证书提供错误
- npm - Npm 工作区:用于开发和发布的不同“主要”属性?
- github - 如何在 github CI/CD 管道中制作工作 dotnet-lambda 工具?
- mysql - 如何在分组前预过滤日期
- c++ - 如何在反应中运行 qtwebsocket webassembly?
- c# - 使用 ProcessStartInfo 时如何将命令写入 cmd.exe
- c# - 如何获得测试用例 testcleanup 失败的测试结果