Тема: Реєстрація користувачів (Безпека).
Створення форми реєстрації. Реальне хешування нового пароля у базі (password_hash) та перевірка при логіні (password_verify).
Мета: Навчитися працювати зі стандартами безпеки зберігання приватних користувацьких даних: правилам генерації “солоних” гешів (salting and hashing), і замінити фейкову авторизацію на реальну.
Технологічний стек: PHP Password Hashing API (password_hash(), password_verify()), SQL (INSERT INTO users, SELECT ... FROM users).
users бази даних, використовуючи функцію криптографічного хешування паролів password_hash().password_verify().register.php)У файлі register.php створіть HTML-форму із полями “Ім’я”, “Електронна пошта” (Email) та “Пароль”. Метод POST.
В PHP напишіть обробник, який (після перевірки !empty() усіх полів) підготує пароль до зберігання:
$plainPassword = $_POST['password'];
// Конвертація "чистого" паролю у зашифрований рядок
// за допомогою безпечного алгоритму BCRYPT:
$hashedPassword = password_hash($plainPassword, PASSWORD_DEFAULT);
Тепер пароль (наприклад, “12345”) виглядатиме як довгий випадковий набір символів на кшталт: $2y$10$C82a...
Перевірте, чи не існує вже такого користувача (запит SELECT id FROM users WHERE email = :email). Якщо є — додайте в масив $errors повідомлення “Ця пошта вже зайнята”.
Якщо все добре, виконайте підготовлений INSERT INTO users (username, email, password) VALUES (:name, :email, :pass).
У значення :pass обов’язково передайте підготовлений на попередньому кроці $hashedPassword!
Якщо вставка пройшла успішно, автоматично перенаправте користувача на сторінку login.php.
login.php)Відкрийте свій login.php. Видаліть фейкову перевірку “admin / 12345”.
Тепер при отриманні POST з логіном (емейлом) та паролем спочатку знайдіть рядок із користувачем у БД:
SELECT * FROM users WHERE email = :email LIMIT 1. Отримайте масив асоціативного рядка (або false, якщо пошти немає) через метод $stmt->fetch().
Якщо користувача знайдено if ($user), перевірте пароль за допомогою спеціальної функції PHP, яка сама аналізує сіль і алгоритм створення password_hash:
if (password_verify($_POST['password'], $user['password'])) { // в базі пароль у стовпці password
// Якщо тут - паролі успішно збіглись!
$_SESSION['is_logged_in'] = true;
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_name'] = $user['username'];
header('Location: index.php'); exit;
} else {
// Ввели неправильний пароль
$errors[] = "Невірний пароль!";
}
Зареєструйе нового користувача через форму. Відкрийте phpMyAdmin, перейдіть до таблиці users та подивіться, як захищено ваш пароль. Спробуйте залогінитися зі щойно створеними даними (правильними і навмисно хибними).
password_hash автоматично додає її до хешу під час генерації? (Підказка: Райдужні таблиці - Rainbow Tables).if(md5($_POST['password']) === $user['password'])? Чому необхідно використовувати виключно password_verify?password_verify під час логіну бере інформацію про те, який саме алгоритм (bcrypt, argon2id) та “сіль” використовувались для створення пароля, щоб змоділювати його повторно?lab17.md скинути фрагмент коду register.php (де хешується пароль) та обробник логіну з login.php.users. (На скриншоті повинно бути видно збережений довгий хеш замість звичайного паролю).