Я пытаюсь создать систему регистрации и входа для своего веб-сайта, однако я хотел бы использовать более безопасный метод шифрования паролей, чем md5, но у меня возникают проблемы.
function register_user($register_data) {
array_walk($register_data, 'array_sanitize');
$register_data['password'] = password_hash($register_data['password'], PASSWORD_BCRYPT, ['cost' => 10]);
$fields = '`' . implode('`, `', array_keys($register_data)) . '`';
$data = '\'' . implode('\', \'', $register_data) . '\'';
mysql_query("INSERT INTO `users` ($fields) VALUES ($data)");
email($register_data['email'], 'Activate your account', "Hello " . $register_data['first_name'] . ",\n\nYou need to activate your account, so use the link below:\n\nhttp://thepuzzler.net/activate.php?email=" . $register_data['email'] . "&email_code=" . $register_data['email_code'] . " \n\n -ThePuzzler"); }
Это моя функция регистрации, с которой у меня не было проблем, потому что когда пользователь регистрируется, пароль BCRYPT сохраняется в моей базе данных. Проблема в проверке пользователя.
function login($username, $password) {
$user_id = user_id_from_username($username);
$username = sanitize($username);
$password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0) == 1) ? $user_id : false; }
Это моя система входа в систему, и когда я пытаюсь войти в систему, я получаю свою собственную ошибку в имени пользователя или неверном пароле. Это потому, что я думаю, что зашифрованные пароли не совпадают. Так что я думаю, что это связано с линией, где я создаю $password
переменная и зашифровать его.
Кроме того, в моей базе данных столбец паролей varchar (64). Спасибо за вашу помощь
password_hashФункция () генерирует индивидуальную соль при каждом вызове. Для подтверждения пароля вам понадобится password_verify() функция.
Поэтому вам необходимо получить хеш пароля из базы данных и передать его вместе с введенным паролем в password_verify ().
Редактировать:
Как это:
function login($username, $password) {
$usernameForDb = mysql_real_escape_string($username);
$hashFromDb = mysql_result(mysql_query("SELECT password FROM users WHERE username = '$usernameForDb'"));
$isValid = password_verify($password, $hashFromDb);
if ($isValid) {
// user is accepted, get userID
return user_id_from_username($username);
}
return false;
}
Других решений пока нет …