PHP password_verify 不能与准备好的语句一起使用

Posted

技术标签:

【中文标题】PHP password_verify 不能与准备好的语句一起使用【英文标题】:PHP password_verify not functioning with prepared statement 【发布时间】:2018-10-21 22:18:14 【问题描述】:

我开始使用 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 对数据库密码进行哈希处理。我不确定这是否在此错误中起作用。

由于无法验证密码,当然是跳到else,回显密码不正确。

有人发现问题了吗?

【问题讨论】:

切换变量。描述是bool password_verify ( string $password , string $hash ),所以POST密码在前,然后是数据库结果。 @aynber - 您介意发布一个答案,以便我可以将其作为已回答的内容进行核对吗? 首先,你喜欢被黑吗?如果不修剪输入,我永远不会在查询中使用 $_POST 变量或与数据处理等效的东西...... @YvanWatchman - 好吧,我开始使用准备好的语句来防止黑客攻击。你想建议什么?我应该清理参数,将其设置为变量,然后在查询中使用该变量吗? @JohnBeasley 确实,使用例如 htmlspecialchars() 和/或 trim() 清理变量。 PDO Prepare 不会修复每一次黑客尝试:P 将其保存到变量是可能的,并且为了防止 s-s-rF 黑客在使用后取消设置变量(包括 $_POST[])非常有用! 【参考方案1】:

根据函数bool password_verify ( string $password , string $hash )的描述,首先需要明文密码,然后是数据库中的哈希密码

password_verify($_POST['password'], $row['password']))

【讨论】:

所以在将我的代码转换为您的建议后,我发现现在,我可以输入任何密码,无论对错,我都可以访问该网站。想法? 这很奇怪。您可能想在测试时回显 password_verify 的值和结果,只是为了看看发生了什么。 好的 - 我发现了问题。我在javascript方面。包在我身上。谢谢你的帮助。不知道为什么我被否决了,但谢谢。

以上是关于PHP password_verify 不能与准备好的语句一起使用的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO MySQL password_verify问题

为啥 hash_equals 和 password_verify 不能正常工作?

使用 PHP 5.5 的 password_hash 和 password_verify 函数

php password_verify 不适用于数据库 [重复]

password_verify 不验证哈希

password_verify不验证哈希