При попытке войти в систему в качестве одного из зарегистрированных пользователей , всегда появляется сообщение об ошибке «Неверный пароль» для определенных (новых) пользователей, хотя я наверняка использую правильный пароль. Честно говоря, я открыл этот код спустя месяц после его написания. Когда я попытался войти в систему как один из зарегистрированных пользователей, которых я сделал месяц назад, проверка работает, и я могу войти в систему правильно. Однако для пользователей, зарегистрированных за последние несколько дней, это не работает, и я получаю упомянутое выше сообщение об ошибке.
Пример хэша пароля, который проверяется правильно:
$2 y$10$dlF5HhlkSI5NZPHHKfN.l.1RYLAwVJ40mDv.zWzSNaRKiGlpR6EX6
Пример хэша пароля для чего я получаю ошибку проверки:
$2y$10$Rub3eSjaDVeG54KvwJ9C5ulvo0en3j7tQhzOGsPLW2y3pNYb4Ckhm
Мне не известно о внесении каких-либо изменений в код за последний месяц, и я всегда использую Метод BCRYPT. Все мои хеши (как старые, так и новые) начинаются с $2y$10$. Я использую PHP 8.2.12 на Apache через Xampp.
Не могли бы вы подсказать, что не так? Заранее большое спасибо.
Вот как определяется таблица моей базы данных:
Код: Выделить всё
CREATE TABLE users
(
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
user_name VARCHAR(25) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role ENUM('admin', 'registered_user') NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Код: Выделить всё
$stmt = $conn->prepare("SELECT id FROM users WHERE user_name = ? OR email = ?"); // Prepare SQL statement to check if user or mail already exists
$stmt->bind_param("ss", $form_data["user_name"], $form_data["email"]); // Bind input parameters to statement
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$errors["user_name"] = "This username or email is already registered.";
}
$stmt->close();
if (empty($errors)) {
$password_hash = password_hash($password, PASSWORD_BCRYPT); // Hash password by method BCRYPT
$role = 'registered_user';
$stmt = $conn->prepare("INSERT INTO users (first_name, last_name, user_name, email, password_hash, role) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssss", $form_data["first_name"], $form_data["last_name"], $form_data["user_name"], $form_data["email"], $password_hash, $role);
if ($stmt->execute()) {
$stmt->close();
$conn->close();
unset($_SESSION['csrf_token']); // Remove token only after successful registration
header("Location: registration_success.php");
exit();
} else {
echo "Registration error: " . $stmt->error;
}
}
Код: Выделить всё
$stmt = $conn->prepare("SELECT id, password_hash FROM users WHERE user_name = ? OR email = ?");
$stmt->bind_param("ss", $user_name, $user_name);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
// Fetch password hash and verify
$stmt->bind_result($user_id, $password_hash);
$stmt->fetch();
// Debugging output - remove in production
echo "Hashed Password from DB: " . $password_hash . "
";
if (password_verify($password, $password_hash)) {
// Successful login, create session
$_SESSION["user_id"] = $user_id;
$_SESSION["user_name"] = $user_name;
echo "Login successful! Welcome, " . htmlspecialchars($user_name) . ".";
} else {
$errors["password"] = "Incorrect password.";
}
} else {
$errors["user_name"] = "No user found with that username or email.";
}
$stmt->close();
- проверьте, как пароль_хэш хранится в БД — это должно быть нормально, поскольку я использую тип данных, который не обрезать сохраненные значения,
- проверить, что я использую методы PHP, такие как пароль_хэш в registragion.php и пароль_валидате в логин.php - все должно быть нормально,
- создать текстовый вывод для входа в систему, который показывал бы на экране хеш-пароль, полученный из БД, чтобы проверить, правильно ли он был прочитан - я пробовал это, и он всегда показывал тот же хэш, который хранится в БД.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ot-working
Мобильная версия