在Rails中,什么可能导致用户拥有另一个用户的会话?

时间:2010-03-19 10:27:07

标签: ruby-on-rails security apache session passenger

我有一个Rails应用程序使用身份验证系统使用Restful Authentication而不做任何修改。

用户报告发现自己以错误的用户身份登录。在至少一个案例中,它是在他们的第一个页面视图中,从未登录过。

他们的会话ID可能会混淆吗?切换到CookieStore会不会发生这种情况,因为没有会话数据以这种方式存储在服务器上? 我怀疑问题与Passenger有关,但我不知道从哪里开始调试。它只在生命的几个月内发生了大约4次,因此几乎不可能重现。

环境: ActiveRecord会话存储 Rails 2.2.2 乘客2.0.1 Apache 2 Ruby 1.8.6

非常感谢

3 个答案:

答案 0 :(得分:0)

如果您使用客户端会话存储(默认为较新的Rails版本),则可能是应用程序中的错误,而不是被盗会话(或类似的东西)。确保您知道您使用的会话存储及其工作方式。

答案 1 :(得分:0)

我也看到了这一点......你可能会对这里的主题感兴趣:Users take sessions of other users when sessions are stored in memcached (Rails)

我目前的想法是,这实际上与Passenger相关,这似乎是您所看到的,我所看到的以及其他帖子报告的内容之间的共同组成部分(我们都在使用不同的会话商店)和rails版本。)

答案 2 :(得分:0)

我曾经遇到类似的问题,原因是用户存储在类变量而不是实例变量中。例如,您可以像这样验证/存储您的用户:

  def current_user
    User.current ||= ( login_from_session || login_by_password )
  end

在这种情况下,用户将存储在类中而不是实例中,登录的第一个用户将存储在类中,并且也将被传递给下一个用户会话。为了解决这个问题,将其改为

def current_user
  @current_user ||= ( login_from_session || login_by_password )
end

这当然只是众多可能中的一种,但我会通过将会话中的user_id和您使用的用户变量写入日志来查看是否存在任何差异,从而开始我的故障排除。