Три независимых вопроса
Кто обращается? Действительна ли текущая сессия? Разрешено ли этому субъекту выполнить именно эту операцию над выбранным объектом? Успешный вход отвечает только на первый вопрос. Проверка role без проверки владения оставляет горизонтальный доступ к чужим данным.
Авторизацию выполняйте внутри каждого use case после загрузки минимально необходимого контекста. Скрытая кнопка не является правилом безопасности.
Пароль не шифруют
password_hash создаёт одностороннее представление с солью и параметрами алгоритма, password_verify проверяет его. Хранилище не должно уметь восстановить исходный пароль. После успешного входа password_needs_rehash позволяет постепенно обновлять параметры.
Ограничьте частоту попыток по нескольким сигналам, но не создавайте простой механизм блокировки жертвы. Сообщение для неизвестного email и неверного пароля должно быть одинаковым, а время обработки — достаточно близким.
Сессия — случайная ссылка
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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .