【问题标题】:My DB password and user filled-in password, do not match [duplicate]我的数据库密码和用户填写的密码,不匹配[重复]
【发布时间】:2020-10-26 13:32:21
【问题描述】:

我的 php 登录文件有问题。我通过检查电子邮件从我的数据库中询问密码。当我得到这个密码时,我会用用户填写的密码来检查它。

password_verify($Passwd, $row['Passwd']) 中,结果将始终返回 0,但结果应返回 1(密码匹配)。

为什么我的密码不匹配?

登录代码:

<?php
if(isset($_POST['submit'])){

    include_once '../includes/connection.php';

    $Email = $_POST['email'];
    $Passwd = $_POST['passwd'];

    //Create Template
    $sql = "SELECT Passwd FROM user WHERE Email = ?";

    //Create Prepared Statement
    $stmt = mysqli_stmt_init($conn);

    //Prepare Prepared Statement
    if(!mysqli_stmt_prepare($stmt, $sql)){

        echo "SQL Statement Failed";

    } else {

        mysqli_stmt_bind_param($stmt, "s", $Email);

        mysqli_stmt_execute($stmt);

        $res = mysqli_stmt_get_result($stmt);
        
        while ($row = mysqli_fetch_assoc($res)){
            
            echo $Passwd . "<br>";
            echo $row['Passwd'];

            if(password_verify($Passwd, $row['Passwd'])){
                echo "1";
            } else {
                echo "0";
            }
        }

    }

} else {

    header("Location: ../index.php?login=error");
}
?>

注册码:

<?php

if(isset($_POST['submit'])){

    include_once '../includes/connection.php';

    $Username = $_POST['username'];
    $Email = $_POST['email'];
    $Passwd = $_POST['pwd'];

    //Create Template
    $sql = "INSERT INTO user (Username, Email, Passwd)
        VALUES (?, ?, ?);";

    //Create Prepared Statement
    $stmt = mysqli_stmt_init($conn);

    //Prepare Prepared Statement
    if (!mysqli_stmt_prepare($stmt, $sql)) {

        echo "SQL Statement Failed";

    } else {

        $hashed_passwd = password_hash($Passwd, PASSWORD_DEFAULT);
        
        //Replace '?' by the acctual data
        mysqli_stmt_bind_param($stmt, "sss", $Username, $Email, $hashed_passwd);

        //Run parameters inside database
        mysqli_stmt_execute($stmt);
    }


    header("Location: ../index.php?signup=succes");

} else {

    header("Location: ./index.php?sinup=error");

}

?>

Passwd 是数据库中的一个 varchar(50) 列。

【问题讨论】:

  • 您显示的代码看起来没问题。但是,由于我们看不到您发送到服务器的电子邮件和密码,或者包含散列密码的数据库行是什么样的,或者您最初是如何保存密码的,因此很难确切地确定可能会发生什么错了。
  • 当用户创建一个账户时,密码被散列到数据库中password_hash。在我上面的代码中 $row['Passwd'] 如果我回显它,则返回散列密码,如果我回显 $Passwd 它返回用户在表单中填写的实际密码。所以 $row['Passwd'] 是从数据库中散列出来的,而 $Passd 是用户在表单中填写的内容
  • 好的。首次保存密码时可能出现问题。你能展示所有相关的代码吗?
  • 我在哪里可以发布我的其他代码?因为在stackoverflow上有时间限制
  • 太棒了。我在下面写了它作为答案 - 如果有帮助,请标记为“已接受”和/或投票。谢谢:-)

标签: php authentication


【解决方案1】:

password_hash 手册说:

建议将结果存储在可以扩展超过 60 个字符的数据库列中(255 个字符是一个不错的选择)

因此,您需要为数据库中的密码列指定至少 60 个字符的大小 - 但更大的大小例如建议使用 255,以防将来更改默认哈希算法。

您还需要重新生成存储在 50 个字符字段中的所有现有密码,因为它们在保存时会被截断,并且额外的信息已经丢失,这意味着这些旧密码永远无法验证.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多