Сессии и cookies в PHP: логин без лишней магии

Сессии и cookies нужны, чтобы сайт помнил пользователя между запросами. Без них каждый запрос для PHP как новый разговор. В этом уроке сделаем простой учебный логин: пользователь вводит имя, PHP сохраняет его в $_SESSION, а страница показывает приветствие до выхода

Это не полноценная авторизация для production, но правильная первая модель: cookie хранит идентификатор сессии, а данные сессии живут на сервере

Что получится в конце

Если пользователь не вошел, он видит форму. После отправки:

Привет, Алия

Кнопка «Выйти» очищает сессию

Базовый пример

Создайте index.php:

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name'] ?? '');

    if ($name !== '') {
        $_SESSION['user_name'] = $name;
        header('Location: /');
        exit;
    }
}

$userName = $_SESSION['user_name'] ?? null;
?>

<!doctype html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Сессии PHP</title>
</head>
<body>
    <?php if ($userName): ?>
        <p>Привет, <?= htmlspecialchars($userName) ?></p>
        <form method="post" action="/logout.php">
            <button type="submit">Выйти</button>
        </form>
    <?php else: ?>
        <form method="post">
            <input name="name" placeholder="Ваше имя">
            <button type="submit">Войти</button>
        </form>
    <?php endif; ?>
</body>
</html>

Создайте logout.php:

<?php
session_start();
session_destroy();

header('Location: /');
exit;

Запустите:

php -S localhost:8000

Почему session_start должен быть сверху

session_start() нужно вызвать до вывода HTML. PHP должен успеть прочитать cookie с идентификатором сессии и подготовить $_SESSION

Если вывести пробел, HTML или текст до session_start(), можно получить ошибку про headers already sent. Поэтому сессии, cookies и redirect обычно обрабатывают в самом начале файла

Что хранится в $_SESSION

Строка:

$_SESSION['user_name'] = $name;

сохраняет значение на стороне сервера. В браузер обычно уходит только cookie с идентификатором сессии. Поэтому не нужно вручную класть все данные пользователя в cookie

Читать можно так:

$userName = $_SESSION['user_name'] ?? null;

Если ключа нет, пользователь считается не вошедшим

Cookie хранится в браузере и отправляется на сервер с запросами. Session обычно хранит данные на сервере, а cookie содержит только ID сессии

Пример cookie:

setcookie('theme', 'dark', time() + 3600);

Cookie нужно ставить до вывода HTML, как и redirect. Для настроек интерфейса cookie подходят. Для пароля, роли пользователя и чувствительных данных — нет

Почему это не production-логин

В нашем примере нет пароля, базы данных, CSRF-защиты, ограничения попыток, session_regenerate_id, secure cookie-флагов. Это учебная модель, чтобы понять механику

В реальном логине нужны:

  • пароль через password_hash и password_verify;
  • HTTPS;
  • защита форм;
  • обновление ID сессии после входа;
  • аккуратный logout;
  • хранение пользователей в базе.

Частые ошибки

headers already sent. До session_start, setcookie или header уже был вывод. Проверьте пробелы и HTML до PHP-кода

Сессия не сохраняется. Проверьте, принимает ли браузер cookies, не меняется ли домен/порт и вызывается ли session_start() на каждой странице

После logout пользователь все еще виден. Проверьте, что вы снова не записываете $_SESSION['user_name'] и что redirect ведет на правильную страницу

Cookie используется для секрета. Не храните пароль или приватные данные в cookie

Что может быть еще интересно по этой теме

Можно ли сделать логин только на cookie? Технически можно, но безопаснее использовать server-side session или токеновую схему с понятной защитой

Почему после POST нужен redirect? Чтобы обновление страницы не отправляло форму повторно

Нужно ли htmlspecialchars для имени из сессии? Да. Данные могли прийти от пользователя, значит при выводе в HTML их нужно экранировать

Что учить после сессий? Пароли, CSRF, роли пользователей и хранение учетных записей в базе

Что открыть дальше

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x