Ошибка в авторизации

Рейтинг: 0Ответов: 0Опубликовано: 06.07.2023

есть кусок кода который отлично работает :

// Обработка входа пользователя
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Проверка существования пользователя в базе данных
    $query = "SELECT id, role, password FROM users WHERE username = :username";
    $stmt = $db->prepare($query);
    $stmt->execute(array(':username' => $username));

    // Если пользователь найден, проверяем его пароль
    if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $storedPassword = $row['password'];

        // Проверка хешированного пароля с помощью функции password_verify()
        if (password_verify($password, $storedPassword)) {
            $role = $row['role'];

            // Проверка роли и перенаправление на соответствующую страницу
            if ($role === 'admin') {
                header('Location: admin_page.php');
            } elseif ($role === 'manager') {
                header('Location: manager_page.php');
            }
        } else {
            echo "Неверный логин или пароль. Пожалуйста, повторите попытку.";
        }
    } else {
        echo "Неверный логин или пароль. Пожалуйста, повторите попытку.";
    }
}
?>
<form method="POST" action="login.php">
    <input type="text" name="username" placeholder="Логин" required>
    <input type="password" name="password" placeholder="Пароль" required>
    <button type="submit">Войти</button>
</form>

с этим все рабоает отлично и отправляет куда надо каждого пользователя в зависимости от роли.

Решил немного модернизировать код, что бы был лимит на неверный пароль, с таймаутом в день :

// Функция для увеличения счетчика неверных попыток ввода пароля
function incrementFailedAttempts($db, $username) {
    $query = "UPDATE users SET failed_attempts = failed_attempts + 1 WHERE username = :username";
    $stmt = $db->prepare($query);
    $stmt->execute(array(':username' => $username));
}

// Функция для проверки, превысил ли пользователь лимит попыток
function hasExceededAttempts($db, $username) {
    $query = "SELECT failed_attempts FROM users WHERE username = :username";
    $stmt = $db->prepare($query);
    $stmt->execute(array(':username' => $username));
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    return ($row['failed_attempts'] >= 3);
}

// Функция для установки времени тайм-аута
function setLoginTimeout($db, $username) {
    $timeout = strtotime('+1 day'); // Тайм-аут на 1 день
    $query = "UPDATE users SET login_timeout = :timeout WHERE username = :username";
    $stmt = $db->prepare($query);
    $stmt->execute(array(':timeout' => $timeout, ':username' => $username));
}

// Функция для проверки, истек ли временной тайм-аут
function isLoginTimeoutExpired($db, $username) {
    $query = "SELECT login_timeout FROM users WHERE username = :username";
    $stmt = $db->prepare($query);
    $stmt->execute(array(':username' => $username));
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    return (time() > $row['login_timeout']);
}

// Обработка входа пользователя
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Проверка, истек ли временной тайм-аут
    if (isLoginTimeoutExpired($db, $username)) {
        // Если тайм-аут истек, сбрасываем счетчик попыток и продолжаем авторизациию
        $query = "UPDATE users SET failed_attempts = 0 WHERE username = :username";
        $stmt = $db->prepare($query);
        $stmt->execute(array(':username' => $username));
    } elseif { //время тайм-аута еще не истекло, выводим сообщение об ошибке
        echo "Превышено количество попыток входа. Пожалуйста, попробуйте снова позже.";
        exit;
    }

    // Проверка существования пользователя в базе данных
    $query = "SELECT id, role, password FROM users WHERE username = :username";
    $stmt = $db->prepare($query);
    $stmt->execute(array(':username' => $username));
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    // Если пользователь найден, проверяем его пароль
    if ($row) {
        $storedPassword = $row['password'];

        // Проверка хешированного пароля с помощью функции password_verify()
        if (password_verify($password, $storedPassword)) {
            // Если пароль верный, сбрасываем счетчик попыток
            $query = "UPDATE users SET failed_attempts = 0 WHERE username = :username";
            $stmt = $db->prepare($query);
            $stmt->execute(array(':username' => $username));

            $role = $row['role'];

            // Проверка роли и перенаправление на соответствующую страницу
            if ($role === 'admin') {
                header('Location: admin_page.php');
            } elseif ($role === 'manager') {
                header('Location: manager_page.php');
            }
        } else {
            // Если пароль неверный, увеличиваем счетчик попыток
            incrementFailedAttempts($db, $username);

            // Если пользователь превысил лимит попыток, устанавливаем временной тайм-аут
            if (hasExceededAttempts($db, $username)) {
                setLoginTimeout($db, $username);
                echo "Превышено количество попыток входа. Пожалуйста, попробуйте снова через некоторое время.";
                exit;
            } else {
                echo "Неверный логин или пароль. Пожалуйста, повторите попытку.";
            }
        }
    } else {
        echo "Неверный логин или пароль. Пожалуйста, повторите попытку.";
    }

?>

но увы форма упорно не работает, а редактор хостинга почему то начинает ругаться на первом elseif.

прошу сильно не ругаться.

Ответы

Ответов пока нет.