尝试使用登录表单

时间:2018-01-24 11:25:14

标签: php mysql database password-encryption

我正在制作注册和登录表单,要求提供用户的电子邮件和密码。在我的注册文件中,我散列了用户提供的密码,并将其存储在数据库中,函数为password_hash。在我的登录表单中,我尝试使用数据库中存储的散列密码验证用户提供的密码,但是失败了。我使用了password_verify函数。以下是注册码的摘录:

注册文件片段

if(!isset($error)){

    //hash the password
    $hashedpassword = password_hash($_POST['password'], PASSWORD_DEFAULT);
    echo $hashedpassword;

    try {
        $sql = "INSERT INTO users (mail, password, province) VALUES (:mail, :password, :province)";
        $stmt = $db->prepare($sql);

        //Bind variables
        $stmt->bindValue(':mail', $mail);
        $stmt->bindValue(':password', $hashedpassword); 
        $stmt->bindValue(':province', $province);

        //Execute the statement and insert the new account.
        $result = $stmt->execute();

        //If the signup process is successful.
        if($result){
            echo $hashedpassword;
            exit;
        }

     } 
     catch(PDOException $e) {
     $error[] = $e->getMessage();
     }
}

数据库中的哈希密码

对于这些密码,我得到以下散列密码,这些密码存储在数据库中:

足球: $2y$10$q0Y8Mfdl75Dt8op7WaqQM.t5y4LMO6gfYwmbycL1xRMiUUQu8dtWm$2y$10$q0Y8Mfdl75Dt8op7WaqQM.t5y4LMO6gfYwmbycL1xRMiUUQu8dtWm

蟋蟀:
$2y$10$Pyoz1XC0skRjHLjxHdrYYeYplY98w4uOp23QpZb/VNN0y41/6YPJC$2y$10$Pyoz1XC0skRjHLjxHdrYYeYplY98w4uOp23QpZb/VNN0y41/6YPJC

密码行的类型为varchar(255),排序规则为utf8mb4_general_ci密码的存储方式如下:
$2y$10$q0Y8Mfdl75Dt8op7WaqQM.t5y4LMO6gfYwmbycL1xRM... $2y$10$Pyoz1XC0skRjHLjxHdrYYeYplY98w4uOp23QpZb/VNN...

当我将鼠标悬停在密码上时,它会显示原始长度为60'

登录文件片段

这是我的登录文件代码的片段:

$mail = htmlspecialchars_decode($_POST['mail'], ENT_QUOTES);

if(!filter_var($mail, FILTER_VALIDATE_EMAIL) and !empty($_POST['mail'])) {
    $error[] = 'Please enter a valid email address';
}
$stmt = $db->prepare('SELECT mail, password FROM users WHERE mail = :mail');
$stmt->execute(array(':mail' => $mail));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if(!empty($row['mail'])){
$error[] = 'Email provided is good.';
}

$password = $_POST['password'];
$stmt = $db->prepare('SELECT password FROM users WHERE password = :password');
$stmt->execute(array(':password' => $password));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$checkpass = $row['password'];
echo $checkpass;
if(password_verify($password, $row['password'])) {
    $error[] = 'Password provided is good.'; 
}

检查是否可以在数据库中找到电子邮件正常工作,因为它提供了错误消息(我需要将其更改为正常消息)。 但是我无法让密码验证工作。我试图通过$checkpass = $row['password'];
来查看代码拉出数据库的内容 echo $checkpass; 但它没有返回任何东西(也许是因为它只返回一个0或1的值?)。 也许它必须对我尝试从数据库中选择哈希密码的方式做些什么?或者我将它们插入数据库或MySQL表选项的方式?这可能是一个简单的修复,但我尝试了许多不同的东西,我无法让它工作..希望你们能帮忙!

2 个答案:

答案 0 :(得分:3)

第二个查询似乎没用,因为在第一个查询中您已经选择了邮件和密码字段。因此,您只需要执行第一个查询,检查用户是否有效,然后使用password_verify方法检查密码。

你的第二个查询失败(可能),因为在条件中你传递了明文但在数据库中有散列密码,所以你永远找不到任何东西。在执行之前检查打印第二个查询。

答案 1 :(得分:-1)

在登录时执行密码检查查询之前,您应该为输入密码创建哈希密码,并且需要比较哈希密码