静态身份验证的无意会话劫持问题

时间:2020-03-06 14:50:20  来源:igfitidea点击:

我使用restful_authentication的当前版本在GitHub上找到,我有一堆怪会议有关的问题。服务器似乎应该以某种方式向用户分配会话。这仅在越过已注销/已登录的障碍时发生。

这是一个例子。在服务器上没有活动会话的情况下,我以用户A登录到帐户。在另一台计算机上,我以用户B登录。然后从用户B注销时,注销重定向发生后的某个时间,我将以用户A。从这一点来看,我可以继续浏览该站点,就像我以该用户身份登录一样!我通过日志观察到的是,发生这种劫持时,会话ID是不同的。用户A在两个会话中都已登录,但是会话ID完全不同。这只是可能发生的情况的一个例子。由于该问题看似随机,因此我无法可靠地重现该问题。

它似乎不是环境或者正在运行的服务器的症状。我可以同时使用杂种和乘客来重现该问题。我也在开发和生产中看到过它。我在此应用程序中使用基于数据库的会话,它在Rails 2.1.1上运行。我在调用生成器时应用了有状态选项。否则,未对会话的处理方式进行任何其他修改。

更新
这是直接来自restful_authentication的冒犯方法。

# Accesses the current user from the session.
# Future calls avoid the database because nil is not equal to false.
def current_user
  @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false
end

解决方案

如果我们(或者编写restful_authentication的人)将当前用户缓存在类变量中,则可能发生这种情况。我看过很多提倡使用"User.current_user"的文章,但是由于类是在请求中缓存的,因此可能导致会话污染。

该站点是远程的吗?我们是否将其登录到同一网络上的两台单独的计算机上?

我不知道这是否是个解决之道,因为它可以解决。我所做的只是切换到基于cookie的会话,并且一切都进行得很顺利。