Rails 4:会话到期?

Kyl*_*yle 30 cookies session 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并且仍然可用,但事实仍然是它已被弃用.应该可以在不引入更多依赖关系的情况下实现解决方案,或者至少不使用已弃用的功能.

Pat*_*ner 41

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

要回答您的问题,如果您想为会话数据添加额外的超时,您可以执行以下操作:

session[:user_id] = user.id
session[:expires_at] = Time.current + 24.hours
Run Code Online (Sandbox Code Playgroud)

然后,在验证用户时,执行以下操作:

if session[:expires_at] < Time.current
  # sign out user
end
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 请注意,默认情况下,此解决方案不会按原样使用Rails 4.1及更高版本.cookie序列化程序现在默认为JSON,因此Time对象存储为字符串. (6认同)
  • `session [:expires_at] .to_time <Time.current`将起作用 (6认同)

Ner*_*orm 36

实际上rails继承自Rack::Session::Cookie.所以你可以expire_after在你的配置中配置参数session_store.rb.

Sqore::Application.config.session_store(
  :cookie_store,
  key: '_name_session',
  expire_after: 24.hours
)
Run Code Online (Sandbox Code Playgroud)

  • 不,海报明确表示他不想这样做,因为它可以在客户端被篡改. (10认同)