1

我想将我的注册/登录页面从 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() 的解决方案,还是我试图错误地检索数据库?

4

1 回答 1

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;
            }
        }
    }
}

从阅读您的代码开始,我首先注意到的问题是您没有返回一个值,无论它是

真的

或者

错误的

另外,对于了解如何使用 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 看看这个答案(是的,它是我的 - 那里有很多很好的答案,所以做一些研究)这为您提供了从设置 PDO 实例到实际使用它的步骤。任何问题都可以问。更多关于PDO 的信息

于 2013-05-15T19:26:15.463 回答