PHP password_verify无法使用预准备语句运行

时间:2018-05-11 13:22:24

标签: php mysqli prepared-statement bcrypt

我开始使用mysqli预处理语句。一切都运转正常。我发布了Code Review,看看是否有任何不可预见的错误或安全问题。在这里找到:

https://codereview.stackexchange.com/questions/194163/php-login-script

我按照指示更新了我的代码,但是遇到了password_verify的问题。这是代码:

<?php
include('../include/sessions.php');

if(isset($_POST['username']))
{
  $select = "SELECT username, firstname, lastname, email, userlevel, `password` FROM users WHERE username = ?;";
  $stmt = $dbc->prepare($select);

  $stmt->bind_param("s", $_POST['username']);
  $stmt->execute();
  $result = $stmt->get_result();
  $row = $result->fetch_assoc();

  if($row && password_verify($row['password'], $_POST['password']))
  {
    $_SESSION['user'] = $row;

    header("Location: ../cust/home.php");
    die;
  }
  else
  {
    echo "The username/password combination does not match our records.  Please try again.";
  }
}
?>

上面准备的声明相应地执行。我可以返回用户名,名字,姓氏等...但即使我正确输入密码,密码也不匹配。

使用bcrypt对数据库密码进行哈希处理。我不确定这是否在这个错误中起作用。

由于无法验证密码,因此当然会跳到其他地方并回显密码不正确。

有没有人看到这个问题?

1 个答案:

答案 0 :(得分:1)

根据函数bool password_verify ( string $password , string $hash )

的描述,需要首先使用明文密码,然后是数据库中的散列密码
password_verify($_POST['password'], $row['password']))