Проверка хешированного пароля PHP не работает [закрыто]Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Проверка хешированного пароля PHP не работает [закрыто]

Сообщение Anonymous »

Я пишу простое веб-приложение в качестве школьного проекта. Мне нужно использовать ванильный PHP и MySQL. В настоящее время я создал простую базу данных для пользовательских данных и php-файлы для регистрации и входа пользователей (registration.php и login.php).
При попытке войти в систему в качестве одного из зарегистрированных пользователей , всегда появляется сообщение об ошибке «Неверный пароль» для определенных (новых) пользователей, хотя я наверняка использую правильный пароль. Честно говоря, я открыл этот код спустя месяц после его написания. Когда я попытался войти в систему как один из зарегистрированных пользователей, которых я сделал месяц назад, проверка работает, и я могу войти в систему правильно. Однако для пользователей, зарегистрированных за последние несколько дней, это не работает, и я получаю упомянутое выше сообщение об ошибке.
Пример хэша пароля, который проверяется правильно:
$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
);

Это фрагмент кода из Registration.php, связанный с хранением и хешированием пароля:

Код: Выделить всё

 $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;
}
}
Это фрагмент кода из файла login.php, связанный с проверкой пароля:

Код: Выделить всё

$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();
Я пытался найти решение с помощью ChatGPT и GitHub Copilot. Вот что они предложили и что я попробовал:
  • проверьте, как пароль_хэш хранится в БД — это должно быть нормально, поскольку я использую тип данных, который не обрезать сохраненные значения,
  • проверить, что я использую методы PHP, такие как пароль_хэш в registragion.php и пароль_валидате в логин.php - все должно быть нормально,
  • создать текстовый вывод для входа в систему, который показывал бы на экране хеш-пароль, полученный из БД, чтобы проверить, правильно ли он был прочитан - я пробовал это, и он всегда показывал тот же хэш, который хранится в БД.


Подробнее здесь: https://stackoverflow.com/questions/792 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»