Урок 21
Форма входа в систему
20 минКак работает вход?
- Пользователь вводит логин (или email) и пароль
- Ищем пользователя в базе по логину/email
- Если нашли — проверяем пароль через
password_verify() - Если пароль верный — сохраняем данные в сессию
- Перенаправляем на главную страницу
Создаём страницу входа
Создайте файл public/login.php:
<?php
require_once "includes/config.php";
// Если уже авторизован — на главную
if (isset($_SESSION["user_id"])) {
header("Location: index.php");
exit;
}
$page_title = "Вход — $site_name";
$error = "";
$login = "";
// Обработка формы
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$login = trim($_POST["login"] ?? "");
$password = $_POST["password"] ?? "";
if (empty($login) || empty($password)) {
$error = "Заполните все поля";
} else {
// Ищем пользователя
$user = getUserByLogin($login);
if ($user && verifyPassword($user, $password)) {
// Успешный вход!
// Сохраняем данные в сессию
$_SESSION["user_id"] = $user["id"];
$_SESSION["username"] = $user["username"];
// Перенаправляем на главную
header("Location: index.php");
exit;
} else {
$error = "Неверный логин или пароль";
}
}
}
include "includes/header.php";
?>
<h2>Вход в систему</h2>
<?php if (!empty($error)): ?>
<div style="background: #f8d7da; border: 1px solid #f5c6cb; padding: 15px; border-radius: 8px; margin-bottom: 20px;">
<?= escape($error) ?>
</div>
<?php endif; ?>
<form method="POST" style="max-width: 400px;">
<div style="margin-bottom: 15px;">
<label style="display: block; margin-bottom: 5px; font-weight: bold;">Логин или Email:</label>
<input
type="text"
name="login"
value="<?= escape($login) ?>"
placeholder="Имя пользователя или email"
style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box;"
required
>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 5px; font-weight: bold;">Пароль:</label>
<input
type="password"
name="password"
placeholder="Ваш пароль"
style="width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box;"
required
>
</div>
<button
type="submit"
style="width: 100%; background: #F36049; color: white; padding: 12px; border: none; border-radius: 4px; font-size: 16px; cursor: pointer;"
>
Войти
</button>
</form>
<p style="margin-top: 20px;">
Нет аккаунта? <a href="register.php">Зарегистрироваться</a>
</p>
<?php include "includes/footer.php"; ?>
Выход из системы
Создайте файл public/logout.php:
<?php
require_once "includes/config.php";
// Удаляем данные из сессии
unset($_SESSION["user_id"]);
unset($_SESSION["username"]);
// Перенаправляем на главную
header("Location: index.php");
exit;
?>
Обновляем header.php
Добавим в шапку информацию о пользователе. Откройте includes/header.php и добавьте перед закрывающим </header>:
<div style="margin-top: 10px;">
<?php if (isset($_SESSION["user_id"])): ?>
Привет, <strong><?= escape($_SESSION["username"]) ?></strong>!
<a href="logout.php" style="color: white;">Выйти</a>
<?php else: ?>
<a href="login.php" style="color: white;">Войти</a> |
<a href="register.php" style="color: white;">Регистрация</a>
<?php endif; ?>
</div>
Проверяем
- Откройте сайт — в шапке должны быть ссылки "Войти" и "Регистрация"
- Зарегистрируйте нового пользователя (или используйте admin)
- Войдите в систему
- В шапке появится "Привет, [имя]! Выйти"
- Нажмите "Выйти" — снова появятся ссылки входа
Важные нюансы безопасности
Не говорите что именно неверно
$error = "Неверный логин или пароль";
Почему не "Пользователь не найден" или "Неверный пароль"?
Если сказать "пользователь не найден", хакер узнает, какие логины существуют. Это упрощает взлом.
Не храните пароль в сессии
// ПЛОХО!
$_SESSION["password"] = $password;
// ХОРОШО — храним только ID и username
$_SESSION["user_id"] = $user["id"];
$_SESSION["username"] = $user["username"];
Авторизация работает!
В следующем уроке научимся защищать страницы от неавторизованных пользователей.
В следующем уроке научимся защищать страницы от неавторизованных пользователей.
Материалы по теме
- Глоссарий digital-терминов Глоссарий
- Статьи блога по разработке и SEO Блог
- Практические чеклисты по внедрению Чеклисты
- Форма Термин