从md5更改为password_hash

时间:2019-06-11 09:13:51

标签: php html sql pdo

我正在遵循有关创建cms的教程,但是讲师使用md5作为密码,但我试图将其更改为使用password_hash。我的sql数据库中使用的密码确实使用password_hash,但是我对如何在登录页面中进行验证感到困惑。

我已经尝试在登录页面中将md5更改为password_hash,但这不起作用,并且我也尝试了password_verify。我知道应该使用这些选项,但无法弄清楚应该在哪里更改。

<?php

session_start();

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


if (isset($_SESSION['logged_in'])) {
    ?>
    <html>
    <head>
    <title>CMS Tutorial</title>
    <link rel="stylesheet" href="../assets/style.css"/>
    </head>

    <body>
        <div class="container">
        <a href="index.php" id="logo">CMS</a>

        <br />

        <ol>
            <li><a href="add.php">Add Article</a></li>
            <li><a href="delete.php">Delete Article</a></li>
            <li><a href="logout.php">Logout</a></li>

        </ol>


    </div>  
    </body>
</html>



    <?php

}else{
    if (isset($_POST['username'], $_POST['password'])) {
        $username = $_POST['username'];
        //$password = md5($_POST['password']);
        $password = password_hash($_POST['password'], PASSWORD_DEFAULT);

        if (empty($username) or empty($password)){
            $error = 'All fields are required!';
        }else{
            $query = $pdo->prepare("SELECT * FROM users WHERE user_name = ? AND user_password = ?");

            $query->bindValue(1, $username);
            $query->bindValue(2, $password);

            $query->execute();

            $num = $query->rowCount();

            if ($num == 1) {
                $_SESSION['logged_in'] = true;
                header('Location: index.php');
                exit();
                //user entered correct details
            }else{
                //user entered false details
                $error = 'Incorrect details!';
        }
    }
    }
    ?>

    <html>
    <head>
    <title>CMS Tutorial</title>
    <link rel="stylesheet" href="../assets/style.css"/>
    </head>

    <body>
        <div class="container">
        <a href="index.php" id="logo">CMS</a>

        <br /><br />

        <?php if (isset($error)) { ?>

        <small style="color:#aa0000"><?php echo $error; ?></small>
        <br /><br />

        <?php } ?>


        <form action="index.php" method="post" autocomplete="off">
            <input type="text" name="username" placeholder="Username" />
            <input type="password" name="password" placeholder="Password" />
            <input type="submit" value="Login" />
        </form> 
    </div>  
    </body>
<html>

    <?php
}

?>

此刻,我刚刚获得

  

“信息不正确”错误

我创建的

,如果我使用password_verify,我将得到

  

“所有字段均为必填错误”

1 个答案:

答案 0 :(得分:3)

要检查密码,必须使用password_verify()功能而不是password_hash()

前段时间,我写了一个规范的示例Authenticating a user using PDO and password_verify()

如您所见,代码非常简单:您只需要选择密码,然后使用password_verify()

进行比较即可。
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_name = ?");
$stmt->execute([$_POST['username']]);
$user = $stmt->fetch();

if ($user && password_verify($_POST['password'], $user['password']))
{
    $_SESSION['logged_in'] = true;
    header('Location: index.php');
    exit();
}else{
    $error = 'Incorrect details!';
}