Почему сеанс Rails Authenticity Tokens является постоянным, а не уникальным для каждой отправки?

Мне интересно, почему Rails формируют токены аутентичности для всего сеанса, а не генерируются уникально для каждой отправки.

Я исхожу из web2py, где формы создаются с уникальные одноразовые жетоны под названием _formkey. Formkey автоматически предотвращает дублирование отправки в результате двойного щелчка, кэширования кнопки возврата и т. Д.

В Rails вам, по-видимому, придется самостоятельно решать проблему двойной отправки (см. https://stackoverflow.com/a/4683161/165673). Мне кажется, что одноразовые токены аутентичности решат эту проблему, а также сделают их более безопасными?


person Yarin    schedule 06.09.2013    source источник
comment
В частности, я считаю, что подход с использованием одноразового токена более безопасен от атаки BREACH.   -  person Anthony    schedule 06.09.2013


Ответы (1)


Проще реализовать один токен на всю сессию. Подумайте о случае, когда у вас есть две открытых вкладки с формами.

Один токен для сеанса так же безопасен, как и одноразовый токен. Хотя бы в качестве защиты от CSRF-атак.

В Rails вам, по-видимому, придется самостоятельно решать проблему двойной отправки.

Для этого есть готовое решение. Прочтите про disable_with вариант. Конечно, все запросы, которые изменяют данные, должны отправляться через HTTP POST, а не GET.

person lgowin    schedule 06.09.2013
comment
@Igowan - Не знаю, слетает ли более простой для реализации аргумент. web2py делает это и может легко обрабатывать несколько форм на странице / между вкладками (я думаю, что уникальные токены действительно упрощают это). Что касается disable_with, это решение на стороне клиента - удобное для ux, но не надежный способ предотвратить двойную отправку, как это было бы при использовании токенизированного решения. - person Yarin; 06.09.2013
comment
@Yarin Я использую disable_with много лет, и он отлично работает. Я не понимаю, в чем на самом деле ваша проблема. - person lgowin; 10.09.2013
comment
@ Igowin- disable_with не поможет вам с отправкой форм ajax, которые запускаются программно, или с кешированными формами, которые повторно нажимаются после нажатия кнопки возврата. Если на карту поставлена ​​целостность ваших данных, вы не можете полагаться на принудительное применение на основе представлений. - person Yarin; 11.09.2013
comment
Целостность данных @Yarin In Rails обеспечивается уровнем моделей. Вы также можете сделать это с помощью ограничений и проверок БД. disable_with следует использовать для защиты от проблемы двойной отправки - когда кто-то случайно дважды нажимает кнопку отправки. - person lgowin; 13.09.2013
comment
@Igowin - целостность данных в Rails обеспечивается уровнем моделей - вы правы, хорошее замечание. Возможно, я был зациклен на воображаемой проблеме ... - person Yarin; 14.09.2013