PHP

Регистрация и проверка пароля

Algonexys · 07.08.2026 · 👁 0

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;
}