password_verify not returning true/false



我在尝试使用数据库中保存的哈希登录的问题有问题,我以下方式保存密码,效果很好:

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变量,该变量还解释了数据库中插入的错误值。所有这些都放在一起的是一开始的问题。