如何使用bcrypt登录

时间:2013-05-15 19:21:55

标签: php mysql

我想将我的注册/登录页面从md5更改为bcrypt。注册部分没问题,但我无法使登录部分正常工作。 我正在尝试使用bcrypt库; https://github.com/ircmaxell/password_compat/blob/master/lib/password.php

原始登录功能(没有md5)看起来像这样;

function login($username, $password) {
    $user_id = user_id_from_username($username);

    $username = sanitize($username);

    return (mysql_result
    (mysql_query
    ("SELECT COUNT(`user_id`) 
    FROM `users` 
    WHERE `username` = '$username' 
    AND `password` = '$password'"), 0) == 1) ? $user_id : false;
}

我想要做的是检索数据库,但由于mysql_result部分,原始代码是不可能的。 我想例如;

function login($username, $password) {

    $username = sanitize($username);

    $user_query = mysql_query("SELECT `password` FROM `users` WHERE `username` = '$username'");

    $row = mysql_fetch_assoc($user_query);

    $hash = $row['password'];

    password_verify($password, $hash);
}

会解决这个问题,但事实并非如此。

这里有没有mysql_fetch_assoc()的解决方案,还是我试图将数据库错误地解压缩?

1 个答案:

答案 0 :(得分:1)

你需要像这样设置password_verify:

function login($username, $password) {
    $sql = "SELECT * FROM users WHERE username = :username"; // Select all info related to the USERNAME
    $loginQ = $dbh->prepare($sql); // Prepare your query
    $loginQ->bindParam(':username', $username); // Bind your variable
    $loginQ->execute(); // Execute (TRUE or FALSE)

    if ($loginQ) { // If TRUE
        if ($loginQ->rowCount() == 1) { // You should only be returning 1 row with 1 username
            $row = $loginQ->fetch(); // Fetch that row 
            $hash = $row['password']; // Use the row password and assign it to a variable 

            if (password_verify($password, $hash)) { // use passwd_compat function password_verify to check if it passes, if it does return TRUE
                return TRUE;
            }
        }
    }
}

只是在阅读您的代码时,我首先注意到的问题是您没有返回值,无论是

  

TRUE

  

FALSE

另外,为了了解如何使用password_verify,您也可以这样做:

if (password_verify($form_password, $row['password'])) {
    $_SESSION['LoggedIn'] = TRUE;
    header("location: homepage.php");
} else {
   Echo "Wrong password or username please <a href='index.php'><b>Retry!</b></a>";
}

我注意到的下一个问题是你使用的是不安全的旧函数(mysql _)

为了帮助您解决上述问题,我为您制作了一个PDO版本,其中有更多的正面信息,然后是mysql_。

然后设置PDO看看这个answer(是的,它是我的 - 有很多好的答案,所以做一些研究)这给你从设置PDO实例到实际使用它的步骤。有问题请问。 更多关于PDO here