我想将注册/登录页面从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()在这里或者我试图检索数据库错误?
您需要这样设置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实例到实际使用它的步骤。有问题就问。