Страница 1 из 1

не проходит валидация csrf

Добавлено: 2016.03.23, 22:59
raketa
Не у кого не возникают проблемы с csrf? а именно не проходит валидация токена, бывают следующие варианты
1. нет куки с csrf токеном, сессионные и другие куки при этом есть, причина почему их нет не ясна
2. куки есть но не валидные
откровенные попытки взлома не в счет, проблемы у обычных пользователей и все это в основном на мобильниках, за сутки не менее сотни ошибок.
Воспроизвести у себя ну никак не получается, может кто сталкивался?

Re: не проходит валидация csrf

Добавлено: 2016.03.23, 23:33
dmg
не уверен, что мысль верная, но предположу, что проблема со сроком жизни сессии или токена.
попробовать воспроизвести с мобильного в плохой зоне доступа и/или со сменой базовых станций между запросами к серверу.

Re: не проходит валидация csrf

Добавлено: 2016.03.24, 19:41
raketa
подсознательно тоже предположение что связано со сроком, но объяснить ситуацию что сессионные куки есть а куки с токеном нет при том что обе куки выставляются на сессию.
подобные проблемы судя по поиску возникают, но видимо народ не заворачивается сильно.
Повторить все еще не получается.

Re: не проходит валидация csrf

Добавлено: 2016.03.27, 14:08
raketa
Разбираясь с не удобствами которые доставляет защита от csrf.
Для начала сравнение (смотрел очень поверхностно, возможно есть не точности)
Laravel - хранить токен в сессии при этом выставляет не защищенную куки чтобы можно было её считывать при необходимости (аналог то что в Yii выставляет как мета тэги)
Symfony - хранит токен в сессии, судя по issue есть в планах реализовать хранение в куках.

В Yii2 есть возможно как использовать сессию так и хранить в куках (за это отвечает параметр enableCsrfCookie) , в поисках решения проблемы первого поста как эксперимент переключился на хранение токена в сессии в итоге проблем стало не меньше:
- если время жизни сессии истекло (долго открыта вкладка у пользователя) то csrf становится не валидным
- в принципе тоже самое, допустим используется автовход, сессия закончилась при этом у пользователя была открыта форма, пользователь отправляет форму, сессия восстанавливается из куки но валидация csrf не проходит т.к. токен обновился

Плюсов и минусы хранения токена в сессии:
+ увеличивается безопасность (так указано в руководстве)
- доп нагрузка на сервер т.к. нужно стартовать сессию на каждый запрос а том числе если это например googlebot, с учетом того что токен выставляется и в мета теги сессия нужна будет на любую страницу даже если на странице нет формы для отправки данных.
+ на одну куку меньше

Для бэкенда неверно лучший вариант хранить токен в сессии, а проблему истечения срока жизни сессии решать через реализацию Lock Screen.
Для фронтенда решения я не нашел, для Laravel и Symfony есть обсуждения проблемы истечения сессии и не валидного токена но четкого решения нет.
Хранение токена в куки вроде как решает проблему времени жизни сессии но причину возникновения проблемы указанной в первом посте я не нашел.

Не нашел более менее активного обсуждения этого вопроса. Неужели ни у кого возникали такие вопросы?
В Yii2 думаю будет правильным сделать отдельное исключение на csrf чтобы его можно было отлавливать.