🔑
Безопасность

Безопасность сессии — secure cookie, защита от hijacking и regeneration

08.07.2034
← Все статьи

Сессия — это непрерывная связь между пользователем и сервером. После входа пользователя в систему при каждом запросе отправляется идентификатор сессии (session ID), и сервер по нему распознает, какой это пользователь. Если атакующий завладеет этим session ID, он получит полный доступ к аккаунту пользователя — даже не зная пароль. Поэтому защита session ID крайне важна.

Настройки secure cookie

В PHP session ID обычно хранится через cookie. Настройки этого cookie должны быть правильными. Через функцию session_set_cookie_params() устанавливаются следующие параметры: secure=true (отправлять только через HTTPS), httponly=true (нельзя прочитать из JavaScript), samesite='Lax' или 'Strict' (защита CSRF), path='/' (работать на всем сайте). Эти настройки нужно делать до session_start().

Session hijacking — угон сессии

Session hijacking — это завладение атакующим session ID пользователя. Это происходит несколькими способами: через XSS (если cookie не HttpOnly), сетевой sniffing (если нет HTTPS), отправка session ID в URL, man-in-the-middle на публичном WiFi. Защита: обязательный HTTPS, HttpOnly cookie, не отправлять session ID в URL (в php.ini session.use_only_cookies=1), и проверка IP/User-Agent.

Session regeneration — обновление ID

В момент входа пользователя в систему или при важных действиях нужно обновлять session ID. Это делается через session_regenerate_id(true). Параметр true удаляет старую сессию. Зачем это нужно? В атаке session fixation атакующий сначала создает свой session ID и заставляет пользователя войти в систему с этим ID. Затем он может действовать от имени пользователя через этот ID. Regeneration этому препятствует.

Session timeout — ограничение по времени

Сессия не должна длиться бесконечно. Есть два типа timeout: absolute timeout (сколько вообще) и idle timeout (сколько без активности). В банковских приложениях idle timeout обычно 5-15 минут, absolute timeout 1-2 часа. На обычных сайтах idle может быть 30 минут, absolute 24 часа. Для реализации timeout в сессии хранится время last_activity и проверяется при каждом запросе.

Проверка IP и User-Agent

В качестве дополнительной защиты в сессии могут храниться IP адрес и User-Agent string пользователя. При каждом запросе они проверяются — если изменились, сессия завершается. Но внимание: IP адрес может быстро меняться в мобильной сети. Поэтому можно сравнивать только первые 3 блока IP или номер AS.

Logout — завершение сессии

При выходе пользователя из системы сессия должна быть полностью завершена. Это состоит из трех шагов: 1) очистить $_SESSION, 2) вызвать session_destroy(), 3) удалить cookie. Сделать только одно недостаточно — нужны все три.

Практика Sayt.uz

На платформе Sayt.uz сессионные cookie автоматически устанавливаются с флагами Secure и HttpOnly. Настройка SameSite=Lax дает защиту CSRF. При входе session_regenerate_id выполняется обязательно. Idle timeout 30 минут, absolute timeout 24 часа. Разместив свой сайт на хостинге Sayt.uz, сессии безопасно передаются через HTTPS. Также доступен бесплатный SSL сертификат.

Похожие статьи

🛡️ Защита от ransomware: бэкапы, сегментация, EDR и реагирование на инциденты 🎣 Защита сотрудников от фишинговых атак: обучение и технические меры 📋 Чеклист аудита безопасности: WordPress, сервер, SSL и проверка резервных копий 🔐 Мониторинг SSL-сертификатов: отслеживание срока действия и авто-обновление
🌐 Язык
🇺🇿 O'zbek 🇺🇿 Ўзбек 🇷🇺 Русский 🇬🇧 English