Проблемы параллелизма сеанса с несколькими вкладками, приводящие к невозможности проверки подлинности токена CSRF - PullRequest
1 голос
/ 05 июня 2019

У меня есть приложение электронной коммерции, работающее на Rails 5.1.5 с redis-session-store, но, похоже, существует проблема параллелизма с сессиями, когда я открываю более 1 вкладки одновременно.

Вот пример того, как воспроизвести проблему:

  • Представьте, что вы либо никогда не обращались к приложению, либо вы просто очистили куки;
  • Затем вы открываете две ссылки на других вкладках довольнобыстро, поэтому вторая вкладка открыта до того, как первая завершит запрос;
  • Теперь на одной из вкладок у вас есть недопустимый CSRF-токен.И нет никакого способа определить, какой это.

Из того, что я видел до сих пор, кажется, что сервер действительно назначает каждому запросу разные session_id, один переопределяет другой, как вы можете видетьв репродукции ниже:

# first request
method=GET path=/my-url format=html controller=ProductsController action=show status=200 session=8cb3c8e8481f4e04772b5d77125132df

# second request
method=GET path=/other-url format=html controller=ProductsController action=show status=200 session=da126c627467fb5e2ab8be9e82c22b85

# notice the different session ids

Эта информация о сеансе, конечно, добавляется в полезную нагрузку логарифма следующим образом:

#app/controllers/application_controller.rb

  def append_info_to_payload(payload)
    super
    payload[:session] = request.session_options[:id] rescue ""
  end

После этого на одной из вкладок будет неверный csrf.и это вызовет действительно неловкие проблемы, потому что, поскольку все кнопки «Добавить в корзину» являются кнопками method: :post, remote: true, когда пользователи пытаются добавить товар в свои корзины, они фактически оказываются на пустой странице корзины из-за направляющиханнулирование сеанса пользователя, когда Can't verify CSRF token authenticity. происходит.

Есть мысли?

Редактировать:

Изучая файлы cookie в инструментах разработчика Chrome, яМожно сказать, что обе вкладки имеют один и тот же session_id, как и ожидалось. Таким образом, эта проблема относится только к CSRF-токену, сгенерированному до переопределения session_id.

...