Самоучитель: динамические веб-приложения
Глава 10 из 18V. Доверие и безопасность110 минут

Глава 10. Идентичность, сессия и право на действие

Аутентификация устанавливает личность, сессия переносит её между запросами, а авторизация заново решает право на конкретный объект и действие.

После главы вы сможете
  • разделить authn и authz
  • защитить session cookie
  • спроектировать восстановление

Три независимых вопроса

Кто обращается? Действительна ли текущая сессия? Разрешено ли этому субъекту выполнить именно эту операцию над выбранным объектом? Успешный вход отвечает только на первый вопрос. Проверка role без проверки владения оставляет горизонтальный доступ к чужим данным.

Авторизацию выполняйте внутри каждого use case после загрузки минимально необходимого контекста. Скрытая кнопка не является правилом безопасности.

Пароль не шифруют

password_hash создаёт одностороннее представление с солью и параметрами алгоритма, password_verify проверяет его. Хранилище не должно уметь восстановить исходный пароль. После успешного входа password_needs_rehash позволяет постепенно обновлять параметры.

Ограничьте частоту попыток по нескольким сигналам, но не создавайте простой механизм блокировки жертвы. Сообщение для неизвестного email и неверного пароля должно быть одинаковым, а время обработки — достаточно близким.

Сессия — случайная ссылка

Серверный сеансCookie содержит непредсказуемый идентификатор, а предметные данные и права остаются на сервере.LoginverifyRotatenew idCookieopaque idSession storeidentityAuthorizeresource
Cookie содержит непредсказуемый идентификатор, а предметные данные и права остаются на сервере.

Cookie-настройки

Для HTTPS включите Secure, для защиты от чтения JavaScript — HttpOnly, для межсайтового поведения выберите SameSite осознанно. Path и Domain должны быть настолько узкими, насколько позволяет приложение. После входа и повышения привилегий обновляйте идентификатор сессии.

PHP 8.5 поддерживает partitioned cookie в session- и setcookie-API, но это специализированный механизм для embedded-сценариев, а не замена обычной модели first-party сеанса.

Восстановление доступа

Генерируйте одноразовый случайный токен, храните только его хеш и короткий срок действия. Публичный ответ не подтверждает наличие email. После успешной смены пароля пометьте токен использованным и решите, нужно ли завершить остальные сессии.

Ссылка должна использовать HTTPS и не вести через сторонние редиректы или аналитику, способную получить токен из URL.

Права на объект

Запрос /tasks/42 не становится разрешённым после проверки, что id является числом. Repository возвращает задачу, policy сопоставляет пользователя, организацию, роль и действие. Для массовых списков право встраивается в запрос, чтобы приложение не загружало чужие строки и не фильтровало их после.

Журналируйте административные действия и изменения доступа, но не полный session id и не password hash.

Практика главы

Опишите регистрацию, вход, выход, восстановление и просмотр одной задачи. Для каждого сценария укажите публичный ответ, внутреннюю причину отказа, ротацию сессии и rate limit.

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie