0

我的登录表单无法识别现有用户。我存储在数据库中的密码是使用 PHP 的 crypt() 函数加密的。当用户注册时,他们的密码也被加密并插入数据库。

正如您在下面的代码中看到的那样,它会检查下面输入的密码是否匹配,但是每当我输入存储在数据库中的具有相应用户名的密码时,它就会表示该用户不存在。

我是 PDO 的新手,这是我第一次使用它,通常如果我只使用 MySQL,它可以正常工作,但由于某种原因不是这样,我已经稍微更改了代码,但它仍然无法正常工作。任何人都知道为什么/在哪里/我在代码中做错了什么。

include "connect.php";

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * FROM users WHERE username=:username";
$statement = $db->prepare($sql);
$statement->bindValue(':username',$username,PDO::PARAM_STR);

if($statement->execute())
{
    if($statement->rowCount() == 1)
    {
        $row = $statement->fetch(PDO::FETCH_ASSOC);

        if(crypt($password, $row['username']) == $row['user_password'])
        {
            $username = $row['username'];
            $email = $row['email'];

            $_SESSION['username'] = $username;
            $_SESSION['email'] = $email;
            $_SESSION['logged_in'] = 1;

            header("Location: index.php");
            exit;
        }
        else
        {
            include "error_login.php";
        }
    }
    else
    {
        include "error_login.php";
    }
}
4

2 回答 2

0

要使用存储的哈希值验证密码,您需要知道盐和之前用于生成哈希值的算法。这个盐可以从存储的哈希值中提取,因为 crypt() 将它存储为结果字符串的一部分。

if (crypt($password, $row['user_password']) === $row['user_password'])

PHP 5.5 将有自己的函数password_hash()和 password_verify() 准备好,以简化生成 BCrypt 哈希。我强烈推荐使用这个优秀的 api,或者它是早期 PHP 版本的兼容包。用法非常简单:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
于 2013-06-19T20:47:47.400 回答
0
if(crypt($password, $row['username']) == $row['user_password'])

应该

if(crypt($password) == $row['user_password'])
于 2013-06-19T18:24:52.977 回答