Ошибка в авторизации
есть кусок кода который отлично работает :
// Обработка входа пользователя
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.
прошу сильно не ругаться.
Источник: Stack Overflow на русском