【问题标题】:Using session while sending set of AJAX requests在发送一组 AJAX 请求时使用会话
【发布时间】:2014-08-10 09:34:43
【问题描述】:

在我的 Rails 应用程序中,我一次进行了一组 AJAX 调用,这导致为每个请求发送相同的会话 cookie。 问题是 Rails 在每个响应中都设置了新的会话 cookie,因此它期望之后的请求中的 cookie 值。

我正在寻找服务器端解决方案,因为我不想链接这些请求(它们很耗时)。

是否可以改变这种行为?它会带来哪些安全风险?

(我使用的是 Rails 4.1.0)

非常感谢

【问题讨论】:

    标签: ruby-on-rails ajax session ruby-on-rails-4


    【解决方案1】:

    如果用户还没有会话 cookie,那么您无能为力。

    如果您可以保证用户已经有一个会话(例如,如果您要求用户登录),那么您可以使用服务器端会话存储来做到这一点。

    对于服务器端会话存储,会话 cookie 仅包含一个标识符 - 即使您的重叠 ajax 请求更改了会话中的值,它们也不会更改会话 cookie。一般来说,这是更好的安全性:例如,旧会话在用户注销后无法重播。 Rails 出于性能原因默认切换到 cookie 存储:不需要访问外部数据存储(但是它确实略微增加了每次请求发送的数据量)

    虽然切换到服务器端会话存储是不够的,但仍然会让您面临竞争条件。很容易得到一个类似的序列

    • 请求 A 加载会话
    • 请求 B 加载会话
    • 请求 B 完成,保存会话
    • 请求 A 保存会话并覆盖 B 所做的会话更改

    您需要一个会话存储,它会尝试将它所做的任何更改与其他请求可能发生的任何更改合并。

    我前段时间写了这样一个session store。我还没有为 rails 4 更新它,因为它不再是我需要的东西,但你可能能够(或至少从中找到灵感)

    【讨论】:

    • 好答案,谢谢!我调查了一下,找到了合适的宝石。 github.com/rails/activerecord-session_store ...我认为没有理由担心您在一开始提到的条件,因为会话是在第一个请求之后设置的,然后是那些 AJAX 调用(已经定义了 session_id)。
    • 我链接到的会话存储是因为活动记录存储(曾经是 Rails 的一部分)在我们使用它的方式上表现出竞争条件而编写的。这可能已经改变,但请检查
    • 幸运的是,在我的项目中我不必担心它,因为只有其中一个请求写入会话。所以问题实际上只是在调用顺序上。但你说得对,其他读者应该考虑这一点。
    猜你喜欢
    • 2020-12-15
    • 2020-09-10
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多