Rails 4:会话到期?

时间:2013-07-05 03:01:51

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

我刚刚从Rails 3.2切换到Rails 4.我正在努力确保我在安全问题上尽可能快速,并且我现在关注会话。看起来Rails 4已经远离支持任何除了基于cookie的会话以外的任何东西,但听起来似乎不可能阻止基于cookie的会话永远存在。我一直在阅读几篇文章,但这篇文章是最正式的:http://guides.rubyonrails.org/security.html#session-expiry。请注意他们如何指出这是基于cookie的会话的问题,然后他们为基于数据库的会话(现在已经弃用,显然)提供了修复。

我真的很困惑。我希望能够阻止攻击者获得一个cookie,使他能够永久访问我的登录保护站点。显然我可以在initializers / session_store.rb中设置:expire_after,但除非我错了,只是设置客户端的cookie过期并且很容易被攻击者修改,以便会话可以永久存在。当然,我可以通过强制SSL,使用安全cookie和仅强制HTTP来使事情变得更好,但在我可以强制执行会话到期之前,这绝不是完整的防御。

当Rails弃用服务器端会话的唯一方法时,如何解决这个问题?

我知道活动记录会话已被转移到gem并且仍然可用,但事实仍然是它已被弃用。应该可以在不引入更多依赖关系的情况下使用解决方案,或者至少不使用已弃用的功能。

3 个答案:

答案 0 :(得分:40)

Rails有“防篡改”会话cookie。为了防止会话哈希篡改,从具有服务器端密钥的会话计算摘要并将其插入到cookie的末尾。只要确保你有一个长长的秘密。如果您想定期重置所有用户会话,请更改您的秘密。

要回答您的问题,如果您想为会话数据添加额外的超时时间,您可以这样做:

session[:user_id] = user.id
session[:expires_at] = Time.current + 24.hours

然后,在对用户进行身份验证时,请执行以下操作:

if session[:expires_at] < Time.current
  # sign out user
end

希望有所帮助。

答案 1 :(得分:34)

实际上rails继承自Rack::Session::Cookie。 因此,您可以在expire_after

中配置session_store.rb参数
Sqore::Application.config.session_store(
  :cookie_store,
  key: '_name_session',
  expire_after: 24.hours
)

答案 2 :(得分:1)

将此添加到您的应用程序控制器:     before_filter:session_expires,:except =&gt; [:login,:logout]     before_filter:update_session_time,:except =&gt; [:login,:logout]

def session_expires
@time_left = (session[:expires_at] - Time.now).to_i
unless @time_left > 0
reset_session
flash[:error] = 'Lorem Ipsum.'
redirect_to :controller => 'foo', :action => 'bar'
 end
end

 def update_session_time
  session[:expires_at] = 60.minutes.from_now
 end