PHP
Регистрация и проверка пароля
password_hash / password_verify с автоматическим обновлением алгоритма при смене настроек.
Код
<?php
declare(strict_types=1);
// Регистрация: соль генерируется автоматически, алгоритм — актуальный по умолчанию
function registerUser(PDO $pdo, string $email, string $password): int
{
if (mb_strlen($password) < 8) {
throw new InvalidArgumentException('Пароль короче 8 символов');
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare('INSERT INTO users (email, password_hash) VALUES (?, ?)');
$stmt->execute([$email, $hash]);
return (int) $pdo->lastInsertId();
}
// Вход: сравнение в постоянном времени + прозрачное перехеширование
function login(PDO $pdo, string $email, string $password): ?array
{
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();
if (!$user || !password_verify($password, $user['password_hash'])) {
return null; // одно и то же сообщение для «нет пользователя» и «неверный пароль»
}
if (password_needs_rehash($user['password_hash'], PASSWORD_DEFAULT)) {
$pdo->prepare('UPDATE users SET password_hash = ? WHERE id = ?')
->execute([password_hash($password, PASSWORD_DEFAULT), $user['id']]);
}
session_regenerate_id(true); // защита от фиксации сессии
$_SESSION['user_id'] = $user['id'];
return $user;
}