我尝试使用我的数据库中保存的哈希登录时遇到问题,我按以下方式保存密码,这样可以正常工作:
adduser($conn, '3', $username, $password);
这会调用以下函数:
function adduser ($conn, $level, $username, $password)
{
$password = mysqli_real_escape_string($conn, $password);
$password = mysqli_real_escape_string($conn, $username);
$password = password_hash($password, PASSWORD_BCRYPT);
$user = "INSERT INTO users (level, username, password)
VALUES ('$level', '$username', '$password')";
mysqli_query($conn, $user) or die (mysqli_error($conn));
}
我的密码字段是CHAR(60)
,因此存储的密码哈希应该是正确的大小。
当我尝试登录时,我会调用此函数:
if (login($conn, $username, $password) === true){
}
这里存在:
function login ($conn, $username, $password)
{
$password = mysqli_real_escape_string($conn, $password);
$username = mysqli_real_escape_string($conn, $username);
$query = "SELECT password FROM `users` WHERE username='$username'";
$result = mysqli_query($conn, $query) or die(mysqli_error($conn));
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
$hash = $row["password"];
$verify = password_verify($password, $hash);
if ($verify)
{
return true;
}
else
{
return false;
}
}
我的问题是它永远不会返回true或false,这使我无法登录...
额外: 它成功地发布到数据库
我也尝试过运行它,它成功地发布了数据库中的数据
$query = "SELECT password FROM `users` WHERE username='$username'";
$result = mysqli_query($conn, $query) or die(mysqli_error($conn));
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
echo $row["password"];
更新
这样做:
echo '<br/>';
echo $hash;
echo '<br/>';
echo $password;
给我以下输出:
$2y$10$OfJhVve4GMZRfjfelb8sNOJ7EN5NAAGOmsN6OS/SC7PZGU5mDNOou
hej
哪个与我的数据库中的密码匹配
$2y$10$OfJhVve4GMZRfjfelb8sNOJ7EN5NAAGOmsN6OS/SC7PZGU5mDNOou
答案 0 :(得分:3)
在测试完整个代码后,我得出以下结论。
这里的问题是你在将密码插入数据库时转义密码,这是我从一开始就在评论中提出的。
&#34;旁注:您不应该转义密码/哈希函数,
123'\abc<
之类的密码完全有效,并会在插入时修改。&#34;
$password = mysqli_real_escape_string($conn, $username);
^的旁注 - 请参阅下面的编辑#2,&#34;然而......&#34; :
只是不要使用它,只需正常保留/使用作业。
password_hash()
和password_verify()
都可以完成工作,因此无需转义密码。
您需要将其从用于将其插入数据库的代码中删除,并使用一组新的哈希值重新开始。
该转义函数最有可能在插入过程中添加一个字符。
附注:只是为了记录,我的密码列是VARCHAR
,但这与CHAR
(编辑:参考脚注)有所不同。如果是,则将您的列改为VARCHAR
。
password_hash()
上的手册,建议长度使用255,这是一个不错的选择。
编辑脚注:
根据评论,我发布了我的回答。
它看起来有所不同。根据接受的答案
,此Q&amp; A What's the difference between VARCHAR and CHAR?显示了它VARCHAR是可变长度的。
CHAR是固定长度。
编辑#2:
经过进一步测试后,看看它是否有所改变,密码栏从VARCHAR(255)
到CHAR(60)
产生了影响;它没有。
进行了测试:
TRUE
。FALSE
。因此,正如我原先所说;错误在于使用mysqli_real_escape_string()
。
然而,再次检查你的代码,这一行:
$password = mysqli_real_escape_string($conn, $username);
您在此处使用$username
变量,该变量也考虑了数据库中插入的错误值。所有这些都是从一开始就存在的问题。