当前位置: 首页 > 知识库问答 >
问题:

我的DB密码和用户填写的密码,不匹配[重复]

狄玉书
2023-03-14

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

共有1个答案

单于海荣
2023-03-14

密码散列手册上说:

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

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

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

 类似资料:
  • 我试图为我用JavaScript制作的密码验证程序开发一个regex表达式。 要求 null

  • 我如何保护我的javascript客户端,你能推荐一些库吗。 提前谢谢你

  • 一旦密码保存到数据库中,在登录过程中不匹配。下面是我的实际功能。 在每次为密码创建散列字符串的函数调用中,该函数下次返回不同的字符串。

  • 我有麻烦管理詹金斯的秘密密码。我希望密码不显示在日志上,但我尝试了两种方法没有成功: 第一次尝试 我尝试使用全局凭据(不受限制)设置用户和pwd,如下所示: 我执行了: 但我可以在日志中看到,用户的写入是正确的,但pwd的写入方式与它的路径相同: 在我的自动测试中,也是通过输入完整路径而不是变量的值。 第二次尝试 我试着用这样的密文: 但控制台日志上显示的是原样的密码。 有人能帮我吗? 先谢谢你。

  • 我用哈希法通过了一个密码 这将密码作为哈希值存储到数据库中。但是当我试图通过 无论密码是否正确,它都会告诉我密码是正确的。有没有办法解决这个问题,所以我可以散列密码,但登录时输入(非散列)密码。

  • 我正在创建一个用户可以登录的网站。当他们创建帐户时,我将哈希密码保存在数据库中。我正在尝试使用password_verify()来确认密码匹配,但它返回false。 为了确认它们匹配,我打印出用户输入的哈希版本和存储在数据库中的哈希密码。我知道一个常见的问题是数据库密码字段对于散列密码来说太小,但我尝试将其设置为VARCHAR(256)和TEXT,以确保存储整个散列密码。 我希望password_