Токен csrf django должен быть уникальным для каждого запроса?

У меня вопрос о механизме Django CsrfViewMiddleware. Я знаю, что Джанго:

  1. Устанавливайте новый файл cookie csrftoken при каждом запросе.
  2. Убедитесь, что значение заголовка X-CSRFToken (или скрытый ввод "csrfmiddlewaretoken") должно быть равно cookie csrftoken.

Но Django не проверяет, использовался ли уже токен (пример из CsrfViewMiddleware):

if not constant_time_compare(request_csrf_token, csrf_token):
            return self._reject(request, REASON_BAD_TOKEN)

Таким образом, я могу отправить несколько запросов с помощью одного и того же токена (я тестировал его на своем сервере).

Это стандартное поведение или у меня неправильная установка Django? Спасибо.


person akozin    schedule 26.08.2014    source источник
comment
Стандарт. Токен не расходуется, а только обновляется при каждом входе в систему.   -  person Germano    schedule 26.08.2014
comment
Понятно. Джермано, спасибо за ответ!   -  person akozin    schedule 27.08.2014


Ответы (1)


Токены CSRF не потребляются.

Чтобы уточнить комментарий Джермано, аргументация проста:

Несколько окон / вкладок браузера и REST

По сути, Django должен был бы создавать (и сохранять, а в распределенном «облачном» развертывании синхронизировать) новые токены CSRF для каждой отдельной страницы, которая отображалась в прошлом. По сути, это легко может привести к атакам типа «отказ в обслуживании», когда вы не можете предполагать какое-либо разумное истечение срока действия CSRF.

person qdot    schedule 27.08.2014
comment
Итак, решение состоит в том, чтобы написать собственное промежуточное ПО, которое будет проверять дату и время истечения срока действия токена CSRF? - person akozin; 28.08.2014
comment
Не совсем так - вы в основном не хотите хранить много разных CSRF для разных представлений или страниц - в противном случае вы создаете механизм, с помощью которого вы можете легко перегрузить базу данных огромным количеством CSRF. - person qdot; 28.08.2014
comment
Я не понимаю проблемы. Почему вы хотите, чтобы срок действия токена истек раньше? - person Germano; 28.08.2014
comment
Цель состоит в том, чтобы дважды отключить HTML-форму для публикации. У меня есть проверки javascript на странице, но я также хотел добавить проверки на сервере. - person akozin; 30.08.2014
comment
@akozin Ты об этом говоришь? en.wikipedia.org/wiki/Post/Redirect/Get - person Germano; 01.09.2014
comment
@Germano, нет. Например, в интернет-магазине пользователь делает заказ. Когда он нажимает кнопку «Сделать заказ», на сервер отправляется POST-запрос. Если пользователь щелкнет дважды, на сервер будут отправлены два запроса POST. Я хотел предотвратить это. - person akozin; 05.09.2014
comment
@akozin Если я понимаю, вы хотите предотвратить двойную отправку формы, когда пользователь дважды щелкает кнопку. Если это так, вы можете решить эту проблему на стороне клиента, отключив форму отправки после первого щелчка. Что-то вроде <form [...] onsubmit="submit_button.disabled=true; return true;"> - person Germano; 05.09.2014
comment
@Germano, да, спасибо. Но что, если пользователь отключил Javascript? Как сделать такие же проверки на стороне сервера? - person akozin; 05.09.2014
comment
Обычным решением было бы одноразовое сохранение значения на стороне сервера и проверка при отправке. Я понимаю, почему вы можете подумать об использовании токена csrf для этого, но, как отмечают другие, он постоянный, поэтому не подходит. Банковские приложения устанавливают уникальный номер на сервере при доставке страницы с формой, а затем, когда отправка возвращается, сохраняют этот номер как отправленный. Двойное сообщение с повторным использованием того же номера будет отклонено. - person Sean; 12.04.2016