<MyRusakov.ru />

Профессия Web-разработчик

Профессия Web-разработчик

Этот комплект за 8 месяцев превратит Вас в Web-разработчика с нуля. Учиться достаточно 1 час в день.

Начнёте Вы с HTML, CSS и вёрстки сайтов. Потом перейдёте к программированию и JavaScript. Затем изучите PHP, MySQL, SQL, Python. Изучите Web-фреймворки Laravel и Django. Создадите 5 своих сайтов для портфолио.

Комплект содержит:

- 540 видеоуроков

- 110 часов видео

- 1205 заданий для закрепления материала из уроков

- 5 финальных тестов

- 7 сертификатов

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

PHP сессии: практическое руководство для начинающих (безопасность, примеры, ошибки)

PHP сессии: практическое руководство для начинающих (безопасность, примеры, ошибки)

PHP сессии — это механизм хранения состояния между запросами. Браузер получает cookie с идентификатором (обычно PHPSESSID), а данные сессии живут на сервере. В этой статье разберём, как работать с сессиями в PHP: запуск, чтение и запись, безопасность (regenerate, HttpOnly, SameSite), флеш-сообщения и мини-пример корзины.

Быстрый старт: session_start, чтение и запись

<?php
declare(strict_types=1);

// Всегда вызывайте session_start() до любого вывода (включая пробелы).
session_start();

// Запись и чтение
$_SESSION['user'] = 'alice';
echo 'Привет, ' . $_SESSION['user'];

// Счётчик посещений
$_SESSION['counter'] = ($_SESSION['counter'] ?? 0) + 1;
echo ' | Вы заходили: ' . $_SESSION['counter'] . ' раз(а)';

Важно: session_start() должен быть вызван до вывода заголовков. Ошибка “Headers already sent” означает, что вы что-то успели вывести раньше (даже пробел или BOM).

Грамотные настройки cookie для сессии

Прежде чем запускать сессию, задайте параметры cookie: срок жизни, безопасность, SameSite.

<?php
// Настраиваем cookie сессии ДО session_start()
session_set_cookie_params([
  'lifetime' => 0,           // до закрытия браузера
  'path'     => '/',
  'domain'   => '',
  'secure'   => isset($_SERVER['HTTPS']), // только по HTTPS
  'httponly' => true,        // недоступно JS - защита от XSS
  'samesite' => 'Lax',       // или 'Strict' для максимальной жесткости
]);

ini_set('session.use_strict_mode', '1'); // защита от фиксации ID
session_start();

Ключевые опции: HttpOnly защищает куку от чтения JS, Secure требует HTTPS, SameSite снижает риск CSRF. Strict безопаснее, но может ломать сценарии с внешними переходами; Lax — разумный компромисс.

Безопасность сессий в PHP: must-have приёмы

  • Регулярно обновляйте идентификатор сессии: session_regenerate_id(true).
  • Включайте session.use_strict_mode, чтобы PHP не принимал неизвестные ID.
  • Привязывайте сессию к среде пользователя (user-agent, при необходимости — к IP).
  • Используйте HTTPS, HttpOnly, SameSite и короткий TTL там, где это возможно.
<?php
session_start();

// Привязка к браузеру (и частично к IP — осторожно с прокси и мобильными сетями)
$key = 'ua_sig';
$signature = hash('sha256', ($_SERVER['HTTP_USER_AGENT'] ?? '') . '|' . ($_SERVER['REMOTE_ADDR'] ?? ''));

if (!isset($_SESSION[$key])) {
  $_SESSION[$key] = $signature;
} elseif ($_SESSION[$key] !== $signature) {
  // Возможная кража сессии - обнуляем
  session_regenerate_id(true);
  $_SESSION = [];
  http_response_code(403);
  exit('Сессия недействительна');
}

Совет: после успешной авторизации всегда делайте regenerate, чтобы предотвратить фиксацию сессии.

<?php
function onLogin(int $userId): void {
  session_regenerate_id(true); // новый ID после логина
  $_SESSION['user_id'] = $userId;
  $_SESSION['logged_at'] = time();
}

Корректный выход: уничтожение сессии и куки

<?php
session_start();

// Очищаем массив сессии
$_SESSION = [];

// Удаляем cookie сессии
if (ini_get('session.use_cookies')) {
  $p = session_get_cookie_params();
  setcookie(session_name(), '', time() - 42000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
}

// Уничтожаем сессию
session_destroy();

header('Location: /');
exit;

Флеш-сообщения (flash): одноразовые уведомления через сессию

Флеши удобны для сообщений после редиректа: «Профиль сохранён», «Ошибка формы» и т.д.

<?php
session_start();

function flash(string $key, ?string $message = null): ?string {
  if ($message !== null) {
    $_SESSION['flash'][$key] = $message;
    return null;
  }
  $msg = $_SESSION['flash'][$key] ?? null;
  unset($_SESSION['flash'][$key]); // одноразово
  return $msg;
}

// Установка и редирект
flash('success', 'Профиль сохранён');
header('Location: /profile.php');
exit;
<?php
// profile.php
session_start();
if ($msg = flash('success')) {
  echo '<div class="alert alert-success">' . htmlspecialchars($msg) . '</div>';
}

Мини-пример: корзина на сессиях

<?php
session_start();

$_SESSION['cart'] = $_SESSION['cart'] ?? [];

function addToCart(int $id, int $qty = 1): void {
  $_SESSION['cart'][$id] = ($_SESSION['cart'][$id] ?? 0) + $qty;
}
function removeFromCart(int $id): void { unset($_SESSION['cart'][$id]); }
function cartTotalItems(): int { return (int) array_sum($_SESSION['cart']); }

addToCart(101, 2);
addToCart(205);
echo 'В корзине товаров: ' . cartTotalItems();

Такую корзину легко расширить: добавить цены, итоги, валидацию и сохранение заказа в БД.

Хранение сессий: файлы, Redis и сборщик мусора

По умолчанию PHP хранит сессии в файлах (session.save_path). Для высокой нагрузки используйте Redis/Memcached.

<?php
// Требуются соответствующие расширения (phpredis или memcached)
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?persistent=1&database=2&prefix=php_sess:');
session_start();

Управляйте сборщиком мусора сессий: session.gc_maxlifetime (время жизни), session.gc_probability и session.gc_divisor (шанс на запуск GC).

Частые ошибки и как их избежать

  • Вывод до session_start() — следите за BOM и пробелами до <?php.
  • Не запускаете session_start() на страницах, где читаете $_SESSION — запускать нужно на каждом запросе, где используете сессию.
  • Забываете regenerate после логина — повышает риск фиксации.
  • Отсутствуют HttpOnly/Secure/SameSite — повышенный риск XSS/CSRF и утечек.

Чек-лист по сессиям

  • session_set_cookie_params + session.use_strict_mode перед session_start()
  • HTTPS + Secure + HttpOnly + SameSite (Lax/Strict)
  • session_regenerate_id(true) после логина и периодически для активных сессий
  • Флеш-сообщения для UX после редиректов
  • Хранилище (files/Redis) и корректный GC

Хотите системно прокачать PHP и освоить работу с БД, практикой и проектами? Загляните в «Полный курс по PHP и MySQL с нуля до гуру — с современными примерами» — отличный следующий шаг после этой статьи.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.