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