Middle+
Ocenite naslednjo implementacijo overjanja: obrazec za prijavo/geslo, backend išče uporabnika v bazi podatkov (tabela: id, uporabniško ime, geslo), pridobi celoten ID in ga zapiše v piškotek z zastavico HttpOnly. Kaj je narobe s takšno implementacijo in kako jo lahko popravite?
sobes.tech AI
Odpoveď od AI
В описанной реализации есть несколько проблем:
-
Хранение ID пользователя в куке напрямую — это небезопасно, так как куки можно подделать или украсть, и злоумышленник сможет получить доступ к чужому аккаунту, подставив чужой ID.
-
Отсутствие механизма проверки подлинности куки — нет подписи или шифрования, чтобы убедиться, что кука не была изменена.
-
Отсутствие срока жизни и защиты от повторного использования (replay attack).
-
Только HttpOnly — хорошо, но не достаточно. Нужно использовать Secure (только по HTTPS) и SameSite, чтобы ограничить доступ к куке.
Как исправить:
- Вместо хранения ID пользователя в куке, использовать сессионный идентификатор или JWT с подписью.
- Если сессии на сервере, то в куке хранить только уникальный сессионный ключ, а данные пользователя хранить на сервере.
- Если JWT, то подписывать токен секретом, чтобы нельзя было подделать.
- Обязательно использовать флаги Secure, HttpOnly и SameSite для куки.
- Добавить срок жизни сессии и механизм её обновления.
Пример с JWT:
// При успешной авторизации создаём JWT с ID пользователя
// и подписываем секретом
// На клиенте в куке хранится только JWT
// Сервер проверяет подпись и извлекает ID из токена
Таким образом, безопасность повышается, и риск подделки куки снижается.