首页 > 解决方案 > 我的数据库密码和用户填写的密码,不匹配

问题描述

我的 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) 列。

标签: phpauthentication

解决方案


password_hash手册说:

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

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

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


推荐阅读