password_verify不返回true / false

时间:2017-04-28 12:24:24

标签: php mysqli

我尝试使用我的数据库中保存的哈希登录时遇到问题,我按以下方式保存密码,这样可以正常工作:

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

1 个答案:

答案 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变量,该变量也考虑了数据库中插入的错误值。所有这些都是从一开始就存在的问题。