Урок 21

Форма входа в систему

20 мин

Как работает вход?

  1. Пользователь вводит логин (или email) и пароль
  2. Ищем пользователя в базе по логину/email
  3. Если нашли — проверяем пароль через password_verify()
  4. Если пароль верный — сохраняем данные в сессию
  5. Перенаправляем на главную страницу

Создаём страницу входа

Создайте файл 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>

Проверяем

  1. Откройте сайт — в шапке должны быть ссылки "Войти" и "Регистрация"
  2. Зарегистрируйте нового пользователя (или используйте admin)
  3. Войдите в систему
  4. В шапке появится "Привет, [имя]! Выйти"
  5. Нажмите "Выйти" — снова появятся ссылки входа

Важные нюансы безопасности

Не говорите что именно неверно

$error = "Неверный логин или пароль";

Почему не "Пользователь не найден" или "Неверный пароль"?

Если сказать "пользователь не найден", хакер узнает, какие логины существуют. Это упрощает взлом.

Не храните пароль в сессии

// ПЛОХО!
$_SESSION["password"] = $password;

// ХОРОШО — храним только ID и username
$_SESSION["user_id"] = $user["id"];
$_SESSION["username"] = $user["username"];
Авторизация работает!
В следующем уроке научимся защищать страницы от неавторизованных пользователей.

Мы используем файлы cookie для улучшения работы сайта и персонализации контента. Продолжая использовать сайт, вы соглашаетесь с использованием cookies в соответствии с нашей Политикой конфиденциальности.