Всем привет!
Подскажите, столкнулся с проблемой, и не пойму в каком направлении искать решение. В интернете много чего перебрал, но такое чувство, что это всё не мой случай.
Есть сайт с формами (авторизация и не только). Открываю инструмент разработчика (F12) и слежу за <meta token>.
При авторизации выдает корректный токен (корректность проверяю исходя из того, что могу разлогиниться без ошибки).
Но при переходе на одни страницы - токен меняется на старый (как будто из кэша берется), а на другие - подтягивается нормально (актуальный токен).
Если рефрешнуть страницы с неправильным токеном - то он обновляется на корректный.
Из-за чего такое происходит? И как исправить такое поведение?
Разобрался в чем дело. SEO-шник попросил добавить в заголовки Expires (для разных типов страниц - разный Expires). Так вот из-за этого и не обновлялся токен. Пришлось убрать из контроллера этот заголовок.
В связи с этим вопрос
можно ли как-то сделать, чтобы и Expires задавался программно (по условию SEO), но и чтобы корректному формированию токена это не мешало?
Update: заголовки оставил, убрал csrf из некоторых форм. Кому интересно почему - читайте комментарии ниже)
Max Logic, Видите ли - csrf это не какое то магическое заклинание, и вообщем то предназначен для защиты изменения каких либо ЧУВСТВИТЕЛЬНЫХ данных. Использовать csrf для какой нибудь фильтрации на сайте - бесмысленно. Так как у вас идет борьба за то что доступно поисковику, а следовательно вряд ли является чувствительными данными - если уж форма доступна поисковику, возможно там csrf нахрен не вперся.
Вопрос поставлен собственно не правильно - браузер который уткнулся в то что страница не обновлялась просто ее не скачивает а берет из кеша - и что там произошло с токеном ему просто плевать.
Дмитрий, конкретно - форма авторизации есть на каждой странице. Получается если указать для каких-то страниц Expires, то при повторном посещении на них не будет работать форма авторизации.
Еще, к примеру, SEO-шник просит указать Expires для страниц товара, а там есть форма добавления товара в корзину. Получается если гость зашел на эту страницу - браузер получил Expires. Пользователь авторизовался. Expires остался старый, и форма добавления товара с csrf-токеном (именно на этой странице товара) перестает работать
Max Logic, а можете мне прикинуть вариант что произойдет если злоумышленик выполнит атаку на форму авторизации? Как он это сделает и что случится? Ну или на форму добавления в корзину?
Дмитрий, Вы вероятнее всего правы, и использование csrf получается избыточно на данных формах... Получается, что всё, что мне надо защищать с помощью csrf - это формы как-то связанные с персональными данными (корзина - оформление заказа, изменение пользовательской информации в профиле, формы связанные с оплатой и доставкой) - и эти страницы как раз и не должны индексироваться поисковиками, а значит и Expires для них задавать тоже не потребуется..
Просто, обычно, привык к тому, что если post - то лучше с csrf, чем без него. А оказывается, что это может в таких моментах только помешать..
Max Logic, конечно. по этому смело в миддлеваре VerifyCsrfToken прописываете исключения, тогда и вы и сеошник радостно бежите к своему счастью. И в дальнейшем собственно подход такой же - что форма меняет, случится что нибудь страшное если ее вызовут скрыто от пользователя и со своими данными - ну тогда csrf обязателен, а если нет, то если не мешает - нехай будет, мешает - выпиливаем
Max Logic,
З.Ы. Как вариант на будущее в таких случаях можете вообще рассмотреть простую вещь, если у нас пользователь авторизован - заголовок Expire не пихаем, если пользователь не авторизован - заголовок Expire вперед.
Так вот сами токены на некоторых страницах не генерируются новые (берутся старые) и тогда возникает ошибка 419 при отправке формы, потому что токен на валиден.