php - 我的数据库密码和用户填写的密码,不匹配
问题描述
我的 php 登录文件有问题。我通过检查电子邮件从我的数据库中询问密码。当我获得此密码时,我会使用用户填写的密码进行检查。
结果将password_verify($Passwd, $row['Passwd'])
始终返回 0,但结果应返回 1(密码匹配)。
为什么我的密码不匹配?
登录代码:
<?php
if(isset($_POST['submit'])){
include_once '../includes/connection.php';
$Email = $_POST['email'];
$Passwd = $_POST['passwd'];
//Create Template
$sql = "SELECT Passwd FROM user WHERE Email = ?";
//Create Prepared Statement
$stmt = mysqli_stmt_init($conn);
//Prepare Prepared Statement
if(!mysqli_stmt_prepare($stmt, $sql)){
echo "SQL Statement Failed";
} else {
mysqli_stmt_bind_param($stmt, "s", $Email);
mysqli_stmt_execute($stmt);
$res = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($res)){
echo $Passwd . "<br>";
echo $row['Passwd'];
if(password_verify($Passwd, $row['Passwd'])){
echo "1";
} else {
echo "0";
}
}
}
} else {
header("Location: ../index.php?login=error");
}
?>
注册码:
<?php
if(isset($_POST['submit'])){
include_once '../includes/connection.php';
$Username = $_POST['username'];
$Email = $_POST['email'];
$Passwd = $_POST['pwd'];
//Create Template
$sql = "INSERT INTO user (Username, Email, Passwd)
VALUES (?, ?, ?);";
//Create Prepared Statement
$stmt = mysqli_stmt_init($conn);
//Prepare Prepared Statement
if (!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL Statement Failed";
} else {
$hashed_passwd = password_hash($Passwd, PASSWORD_DEFAULT);
//Replace '?' by the acctual data
mysqli_stmt_bind_param($stmt, "sss", $Username, $Email, $hashed_passwd);
//Run parameters inside database
mysqli_stmt_execute($stmt);
}
header("Location: ../index.php?signup=succes");
} else {
header("Location: ./index.php?sinup=error");
}
?>
Passwd
是数据库中的一个 varchar(50) 列。
解决方案
password_hash手册说:
建议将结果存储在可以扩展超过 60 个字符的数据库列中(255 个字符将是一个不错的选择)
因此,您需要为数据库中的密码列指定最小大小为 60 个字符 - 但建议使用更大的大小,例如 255,以防将来更改默认散列算法。
您还需要重新生成存储在 50 个字符字段中的任何现有密码,因为它们在保存时会被截断,并且额外的信息已经丢失,这意味着这些旧密码永远无法验证。
推荐阅读
- azure - 初始化容器,在 Azure 管道中执行 useradd 时失败
- sql-server - 在 SQL Server 中调用 API
- gpu - 为什么 Blender 不使用 GeForce RTX 2080 GPU 而只使用 Intel UHD Graphics 630?
- yaml - 如何使用 CloudFormation 脚本从外部文件(例如来自 S3 存储桶)更新 EC2 实例中的文件 application.properties?
- unit-testing - 使用 java 11 进行 pojo 测试
- java - 当 MainActivity 扩展 SDLActivity 时,SDL 无法从 main.cpp 运行主函数
- c++ - 共享库中本地范围内静态变量的生命周期
- angular - 每次运行我的测试,我都会看到错误,这是第一行的完整内容
- xml - 将“常规”正则表达式转换为 xsd-regex
- javascript - 为什么这个经过验证的 JSON Web Token (JWT) 输出未定义?