【问题标题】:password_verify always returns as false [duplicate]password_verify 始终返回 false [重复]
【发布时间】:2021-07-11 11:19:01
【问题描述】:

当我开始自己的工作时,我正在整理一个轻量级的应用程序,但我有点困惑。

我已将密码的数据库列设置为 255,并使用 password_hash 函数获取我插入的哈希。

但现在以下总是返回 false;

if (isset($_POST[submit])) {
    $link = mysqli_init();
    
    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
    if ($conn->connect_error) {
        echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
    }

    $username = $_POST['username'];
    $password = $_POST['password'];

    $query = $mysqli->prepare("SELECT * FROM `admins` WHERE `username` = (?)");
    $query->bind_param('s', $username);
    echo $mysqli->error;
    $query->execute();
    $result = $query->fetch(PDO::FETCH_ASSOC);

    print_r($result);

    if (!$result) {
        echo '<p class="error">Username password combination is wrong!</p>';
    } else {
        if (password_verify($password, $result['password'])) {
            $_SESSION['user_id'] = $result['id'];
            header('Location: results.php');
        } else {
            echo '<p class="error">Username password combination is wrong!</p>';
        }
    }
}

它只是一个小的登录表单、一个用户名、一个密码字段和一个提交按钮,但无论我尝试什么,这里的每个解决方案似乎都提到列长度为 60,应该是 255,我的就是。任何帮助将不胜感激。

编辑;更新了 sn-p 以显示更多...结果未打印,这意味着它没有从我所知道的中得到任何信息?

【问题讨论】:

  • 先检查最基本的步骤:$password输入的密码是否不变,是否正确?
  • 你检查过$result['password'] 是什么吗?你能告诉我们你的password_hash 实现吗?
  • 您正在将密码绑定到 where 子句,但您正在寻找用户名,请将 $password 绑定改为 $username
  • 但更好的是,通过告诉 mysqli 正确抛出异常来避免所有用于错误检查的笨拙 if 语句。 (显然,这需要您在 PHP 中启用错误日志。)如果您需要帮助设置这些内容,请参阅这些指南:stackify.com/php-error-logs-guide(php 错误日志/报告)stackoverflow.com/a/22662582/5947043(mysqli 异常报告)
  • 感谢旁白,这对我来说是全新的,所以我将它们拼凑在一起,英语也不是母语,所以谢谢你的澄清。

标签: php sql password-hash


【解决方案1】:

好的,我想通了。

我没有包含一个 bind_result 来以我可以访问的方式锁定结果,下面的代码工作正常。

if (isset($_POST[submit])) {
    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);

    $username = $_POST['username'];
    $password = $_POST['password'];

    $query = $mysqli->prepare("SELECT * FROM `admins` WHERE `username` = ?");
    $query->bind_param('s', $username);
    $query->execute();
    $query->bind_result($id, $user, $pass);
    $result = $query->fetch();

    print_r($pass);

    if (!$result) {
        echo '<p class="error">Username password combination is wrong!</p>';
    } else {
        if (password_verify($password, $pass)) {
            $_SESSION['user_id'] = $id;
            header('Location: results.php');
        } else {
            echo '<p class="error">Username password combination is wrong!</p>';
        }
    }
}

【讨论】:

  • ....出于好奇:执行该代码不会触发常量submit 尚未定义的警告?
  • 是的,这是我接下来要做的事情。我只是......在某个地方声明它吗?它是调用它的 HTML 表单上的提交按钮,现在可以使用,只是不确定修复是什么。这对我来说都是新的
  • 只需要引用即可。关联索引是一个字符串。
  • 您是否在任何地方声明了该常量?向 HTML 表单添加按钮与声明常量不同,因此您可能想使用 $_POST['submit']
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2018-11-26
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多