使用 MySQL 数据库中的 PHP 验证散列密码

我正在尝试使用 HTML、PHP 和 SQL 开发登录表单。由于我是 PHP 的新手,所以我一直在绞尽脑汁想弄清楚我的问题是什么以及如何解决它,所以我希望得到一些帮助。我想要做的是检查用户在 HTML 登录表单上的输入(在本例中为密码)是否与存储在数据库中的散列密码相匹配。

但是,我目前遇到一个问题,它没有这样做。代码应验证密码,如果密码正确,则应回显“密码和用户名匹配”,否则应回显“密码不正确”,但代码不会回显任何内容。

这是我试过的:

使用用户名获取密码

我正在使用 PHP 的password_hash插件来散列和验证用户的密码。

所以我的问题是,如何使用存储在数据库中的散列密码安全地验证用户的输入(密码)?

这是PHP代码:

if($_SERVER["REQUEST_METHOD"] == "POST") {

    //declare variables and set values to null

    $username = $pass = "";

    $username = $_POST['username'];

    $pass = $_POST['pass'];


    //check if username exists

    $stmt = $conn->prepare("SELECT userName FROM userDetails WHERE userName=?");

    $stmt->bind_param("s", $prepname);

    $prepname = $username;

    $stmt->execute();


    $result = $stmt->get_result();

    if ($result->num_rows > 0) {

        //if username exists, check if password is linked to user

        echo "user exists";

        $stmt = "SELECT userPass FROM userDetails WHERE userName=?";

        $stmt->bind_param("s", $prepname);

        $prepname = $username;

        $hashpass = $stmt->execute();


        $stmt->bind_result($hashpass);

        $stmt->fetch();

        if (password_verify($pass, $hashpass)) {

            echo "password and username match";

        }

        else {

            echo "incorrect password";

        }

    } 

    else {

        echo "That user does not exist!";

        return false;

    }

}

编辑:感谢@Jovi,我已经修复了之前的错误,但是我现在收到了一个新错误:


Warning: Illegal string offset 'userPass' in /home/toeaimc2/public_html/php/pages/login.php on line 75

编辑: @Jovi 现在已经解决了这个问题!感谢大家的帮助!


青春有我
浏览 82回答 1
1回答

慕田峪4524236

您bind_param在字符串上调用该方法,它应该是一个语句对象。您缺少为提取密码的查询创建准备好的语句对象的方法调用:    $stmt = $conn->prepare("SELECT userPass FROM userDetails WHERE userName=?");         $stmt->bind_param("s", $prepname);
打开App,查看更多内容
随时随地看视频慕课网APP