3

我有一个在 Rails 5.1.5 上运行的电子商务应用程序redis-session-store,但是当我同时打开多个选项卡时,会话似乎存在并发问题。

以下是有关如何重现该问题的示例:

  • 想象一下,您要么从未访问过该应用程序,要么只是清除了 cookie;
  • 然后您在其他选项卡上打开 2 个链接非常快,因此第二个选项卡在第一个选项卡完成请求之前打开;
  • 现在在其中一个选项卡中,您有一个无效的 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

当然,此会话信息会添加到 lograge 有效负载中,如下所示:

#app/controllers/application_controller.rb

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

之后,其中一个选项卡将具有无效的 csrf-token,这将导致非常尴尬的问题,因为由于“添加到购物车”按钮都是method: :post, remote: true按钮,当用户尝试将产品添加到他们的购物车时,他们实际上会由于 Rails 在Can't verify CSRF token authenticity.发生事件时使用户会话无效,因此出现在一个空的购物车页面中。

有什么想法吗?

编辑:

通过检查 Chrome 开发工具中的 Cookie,我可以看出两个选项卡共享相同的 session_id,正如任何人所期望的那样。所以这个问题只与在 session_id 被覆盖之前生成的 CSRF 令牌有关。

4

0 回答 0