我在尝试使用数据库中保存的哈希登录的问题有问题,我以下方式保存密码,效果很好:
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;
}
}
我的问题是它永远不会返回对还是错,这使我无法登录...
额外:它成功发布到数据库
我还尝试运行此操作,该数据可成功地发布了我数据库中的数据
$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
测试整个代码后,我得出以下结论。
这里的问题是您在将密码插入数据库时逃脱了,这是我从一开始就在评论中提出的。
"旁注:您不应该逃脱密码/哈希功能,诸如
123'abc<
之类的密码是完全有效的,并且将在插入时进行修改。"
$password = mysqli_real_escape_string($conn, $username);
旁注 ^ - ^ - 请参阅下面的编辑#2,接近"但是..." :
根本不使用它,只要正常保留/使用分配。
password_hash()
和password_verify()
都可以做他们的工作,因此无需逃脱密码。
您需要将其从用来将其插入数据库的代码中删除,然后重新开始使用一组新的哈希。
该逃逸功能很可能在插入过程中添加一个字符。
旁注:仅作为记录,我的密码列是VARCHAR
,但与您的CHAR
并不是区别(编辑:咨询脚注(。如果是将您的列更改为VARCHAR
。
password_hash()
上的手册建议使用255长时间,是一个很好的赌注。
- http://php.net/manual/en/function.password-hash.php
编辑脚注:
根据我在答案下发布的评论。
它看起来有所不同。这个Q&amp; a varchar和char之间有什么区别?根据所接受的答案
表明varchar是可变的。
char是固定的。
- https://stackoverflow.com/a/1885635/1415724
编辑#2:
在进行进一步测试之后,查看它是否通过将密码列从VARCHAR(255)
更改为CHAR(60)
有所不同,这有所不同;它没有。
执行的测试:
- 插入一个新的哈希,而没有逃避功能和验证:
TRUE
。 - 插入了一个新的哈希,并具有逃逸功能和验证:
FALSE
。
因此,正如我最初所说的;故障在于使用mysqli_real_escape_string()
。
然而,再次浏览您的代码,此行:
$password = mysqli_real_escape_string($conn, $username);
您在此处使用$username
变量,该变量还解释了数据库中插入的错误值。所有这些都放在一起的是一开始的问题。