Перейти к содержанию
Yavid Vrn

Session id в url

Большинство разработчиков передают Параметры url и даже не подозревают о рисках. Если вы используете такой подход — вы не одиноки. На первый взгляд это просто: session работает, пользователи авторизуются, приложение функционирует. Но вот в чём проблема. Браузер сохраняет весь URL в историю. Идентификатор session попадает в логи доступа сервера. Видно в реферере при переходе на другой сайт. Злоумышленник перехватывает этот уникальный session id и получает доступ к чужой session. Это не просто плохая практика — это серьёзная уязвимость. В PHP и других фреймворках есть встроенная защита: управление session через защищённые cookies вместо параметров URL, правильная генерация идентификаторов, установка флагов безопасности cookies. Вот почему критично понимать, как передавать session id не через URL. Это защита от реальных session hijacking атак.

Почему session id в URL создает критические уязвимости

Цепочка идентификаторов сеанса вокруг страницы, открытого замка и защищённого cookie
Session id в URL — критическая уязвимость для атак перехвата сессии и компрометации аккаунта пользователя

Идентификатор сессии — это уникальный токен, который сервер присваивает пользователю при входе. Этот токен позволяет серверу узнать, кто пользователь, на каждом следующем запросе. Он хранится на стороне сервера, связан с конкретной сессией, и вся информация о состоянии сессии (логин, права доступа, профиль пользователя) привязана именно к этому идентификатору.

Проблема начинается, когда разработчик передает session id через параметры URL. Вот как это выглядит в коде:

page.php?sid=abc123def456

Кажется просто: session id добавляется как параметр URL, браузер его отправляет с каждым запросом, всё работает. Но вот в чём кроется опасность.

Три основные уязвимости session id в параметрах URL

История браузера

Браузер автоматически сохраняет весь адрес страницы в историю посещений. Если session id находится в URL, он тоже попадает в эту историю. Любой, кто имеет доступ к компьютеру пользователя — друг, коллега, техник, злоумышленник, получивший физический доступ — может открыть историю и увидеть полный адрес со скрытым session id. Затем этот человек может скопировать ссылку, открыть её в своём браузере и получить доступ к аккаунту жертвы без пароля.

Access логи веб-сервера

Каждый запрос к серверу PHP, Node.js, Python или любому другому веб-приложению записывается в access логи. Если session id передаётся через параметр URL, сервер логирует полный адрес со всеми параметрами. При неправильной настройке логирования эти access логи могут быть доступны администратору сервера, прилипнуть в резервных копиях или попасть на хранилище логов, где их смогут увидеть люди с доступом к инфраструктуре. Session id, видимый в логах, — это скомпрометированный session id.

Утечка через Referer Header

Когда пользователь переходит со своего сайта на другой сайт, браузер отправляет заголовок Referer (заголовок адреса, с которого произошел переход). Если session id находится в URL, он передаётся в этом заголовке. Если пользователь с активной сессией переходит на незащищённый или вредоносный сайт, злоумышленник может перехватить этот Referer в логах своего сервера и увидеть session id. Если трафик передаётся по незащищённому HTTP (без HTTPS), перехват происходит ещё проще — можно перехватить прямо в сетевом трафике.

Как происходит session hijacking атака

Вот пошаговый сценарий компрометации сессии:

  1. Пользователь логинится в приложение. Сервер генерирует уникальный session id и передаёт его через URL параметр: shop.com/profile.php?sid=xyz789abc.
  1. Браузер пользователя сохраняет полный адрес в историю посещений.
  1. Пользователь, не заметив опасности, переходит по ссылке на другой сайт. Браузер отправляет заголовок Referer, включая session id.
  1. Злоумышленник логирует все входящие Referer на своём сайте и замечает в них session id вместе с адресом оригинального сайта.
  1. Злоумышленник открывает браузер, переходит на shop.com/profile.php?sid=xyz789abc с украденным session id.
  1. Сервер видит знакомый session id, проверяет его в своей таблице сессий и предоставляет доступ к аккаунту. Система не может различить, что запрос пришёл от злоумышленника, а не от легального пользователя.
  1. Теперь злоумышленник имеет полный доступ к состоянию сессии жертвы: может просмотреть личные данные, изменить пароль, сделать покупки, если это интернет-магазин, или выполнить любые действия от имени пользователя.

Сравнение методов хранения идентификаторов

На практике существуют три варианта передачи session id клиенту:

URL параметры — низкая безопасность. Session id видна везде: в истории браузера, в логах сервера, в Referer при переходах на другие сайты. Подходит только для некритичных данных и не рекомендуется для любой аутентификации.

HttpOnly Cookie — высокая безопасность. Cookie с флагом HttpOnly не может быть прочитана JavaScript-кодом, что защищает от XSS атак. Браузер автоматически отправляет cookie с каждым запросом без необходимости вставлять в URL. Cookie не видна в истории браузера. При правильной настройке (Secure флаг, что передача только по HTTPS) cookie защищена от перехвата в сетевом трафике. Это стандартный подход для хранения session id в web-приложениях на PHP и других стеках.

JWT токены — средний уровень безопасности, требует дополнительной логики. JWT можно передавать в Authorization заголовке, что исключает видимость в URL и Referer. Однако JWT часто хранят в localStorage, что делает их уязвимыми для XSS атак. JWT требует реализации механизма обновления токенов (refresh tokens) и проверки подписи на сервере.

Когда компрометируется сессия

При компрометации сессии злоумышленник получает доступ не просто к техническому идентификатору. Он получает доступ ко всем чувствительным данным, которые привязаны к этой сессии. Это могут быть персональные данные пользователя: имя, телефон, адрес, история покупок, платёжные реквизиты. Это не просто session hijacking в теоретическом смысле. Это прямая угроза конфиденциальности и целостности данных пользователя. Обработка персональных данных через скомпрометированную сессию нарушает требования политики конфиденциальности и может привести к юридическим последствиям для компании.

Вот почему передача session id через параметр URL — это не просто плохая практика кодирования. Это открытая дверь для реальных атак, которые приводят к утечке данных и компрометации аккаунтов.

Правильная работа с session id — лучшие практики безопасности и примеры кода

Почему защищённые cookies лучше параметров URL для сессии?

Правильный способ передачи session id — использование защищённых cookies. Это встроенный механизм браузера, который автоматически отправляет уникальный session id на каждом запросе. Cookie хранит идентификатор сессии в защищённом хранилище браузера, отдельно от параметров URL и логов сервера. На каждом запросе браузер включает cookies в заголовки HTTP, сервер узнает пользователя по session id и восстанавливает состояние сессии. Механизм хранения данных на основе cookies полностью скрывает идентификатор от истории браузера и логов сервера, что невозможно при передаче параметра через URL.

Какие флаги безопасности нужны для cookies?

Защищённые cookies требуют трёх критических флагов безопасности. HttpOnly запрещает доступ из JavaScript — защита от XSS атак. Secure гарантирует передачу только по HTTPS — защита от перехвата. SameSite=Strict блокирует отправку при cross-site запросах — защита от CSRF атак. В PHP для управления session устанавливаются ini_set session.use_only_cookies и session.use_strict_mode, затем setcookie с параметрами [httponly => true, secure => true, samesite => 'Strict']. Python Flask требует конфигурации SESSION_COOKIE_SECURE и SESSION_COOKIE_HTTPONLY. Node.js Express использует express-session middleware. Каждый инструмент обеспечивает сохранение состояния session через защищённый механизм хранения данных, скрывая идентификатор от внешних источников.

Как проверить безопасность сессии при разработке?

Откройте Chrome DevTools на вкладке Application → Cookies для проверки session id. Убедитесь, что сессия находится в cookies, а не передаётся параметром через URL. Проверьте флаги HttpOnly, Secure и SameSite в свойствах каждого cookies элемента. Network вкладка покажет заголовок Cookie в Request Headers каждого запроса. Если session id видна в URL-адресе или истории браузера — это критическая уязвимость. Для приложений, обрабатывающих персональные данные, идентификатор сессии должен быть полностью скрыт от логов. Проверочный список безопасности: наличие HttpOnly флага, Secure флага на production, правильное значение SameSite, session timeout установлен на 15-30 минут, полное отсутствие session id в логах браузера и access логах сервера. Эти проверки критичны перед развёртыванием.

Наверх