To further enhance the security of this proposed design, consider randomizing the CSRF token […] for each request. Implementing this approach results in the generation of per-request tokens as opposed to per-session tokens. Note, however, that this may result in usability concerns.
То-есть никак. Или многоразовый токен, или неудобство пользователя.
Одноразовый токен конечно тоже не дает 100% но он уменьшает вероятность успешной атаки/ уменьшает спектр применимости. Если есть например какая-то дырка, позволяющая видеть весь входящий трафик на сайт, то все токены там будут уже не валидные. Если грубо, то одноразовые токены устаревают часто гораздо быстрее чем сессия. Но вашу мысль я тоже понял. Если по другому не получится нормально — наврно так и сделаем.
А какие-нибудь идеи, кроме использования многоразовых токенов есть?
Например если у вас есть сессия, вы можете запросить форму через GET. И там, в теле HTML будет и токен. Или нет?
Конечно зависит от архитектуры и логики приложения, может у SAP этот токен всегда проверяется, или используются какие-то другие средства.
Но у меня уже готовое приложение, которое давно и активно используется клиентами, и переписывать его заново задачи не стояло.
А как вы узнали SessionID? Перехватили трафик? Ну так и токен там так же можно будет найти.
Я и не говорю что это одно и тоже. Я имел ввиду, что статичный токен лишь немногим безопаснее чем просто SessionID, и не помогает при перехваченном трафике например.
У вас один токен на всю сессию. Этого не достаточно для полноценной защиты. Можно тогда вообще токены не использовать, а брать SessionID — разницы никакой.
Смысла для поиска конечно нет. Но приложение большое и форм много, поэтому я сделал проверку в BasicController, а там отличить POST поиска от других действий не такая тривиальная задача. Кроме того, даже для «не поиска» редирект по F5 на 404 мне не кажется удачной идеей. Странно что это во всех гайдах по CSRF рекомендуют.
> просто не сохраняем данные
Ну в принципе я почти так и сделал. В BasicController очищаю данные из POST, и показывается пустая форма. Но это как-то не очень красиво. Думал, может есть какое-нибудь _правильное_ решение.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Да, спасибо.
То-есть никак. Или многоразовый токен, или неудобство пользователя.