Session Rails 4:会话到期?

Session Rails 4:会话到期?,session,cookies,ruby-on-rails-4,Session,Cookies,Ruby On Rails 4,我刚刚从Rails 3.2切换到Rails 4。我正在努力确保我在安全问题上尽可能地掌握最新的信息,我现在很关心会话。看起来Rails 4已经不再支持基于cookie的会话之外的任何东西,但听起来似乎不可能阻止基于cookie的会话永远存在。我读了好几篇文章,但这篇是最正式的:。注意他们是如何指出这是基于cookie的会话的一个问题的,然后他们为基于数据库的会话(现在显然不推荐使用)提供了一个解决方案 我真的很困惑。我希望能够防止攻击者获得cookie,使其能够永久访问我的受登录保护的站点。显然

我刚刚从Rails 3.2切换到Rails 4。我正在努力确保我在安全问题上尽可能地掌握最新的信息,我现在很关心会话。看起来Rails 4已经不再支持基于cookie的会话之外的任何东西,但听起来似乎不可能阻止基于cookie的会话永远存在。我读了好几篇文章,但这篇是最正式的:。注意他们是如何指出这是基于cookie的会话的一个问题的,然后他们为基于数据库的会话(现在显然不推荐使用)提供了一个解决方案

我真的很困惑。我希望能够防止攻击者获得cookie,使其能够永久访问我的受登录保护的站点。显然,我可以在initializers/session_store.rb中设置:expire_after,但除非我错了,否则只需设置cookie的过期时间,cookie是客户端的,很容易被攻击者更改,这样会话就可以永远存在。当然,我可以通过强制使用SSL、使用安全cookie和仅强制使用HTTP来改善情况,但在我能够强制执行会话过期之前,这永远不会是一个完整的防御

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

我知道active record会话已被移动到gem中,并且仍然可用,但事实是它已被弃用。解决方案应该不引入更多依赖项,或者至少不使用不推荐的功能。

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
如果会话[:过期时间]

希望有帮助。

实际上rails继承自
Rack::Session::Cookie
。 因此,您可以在
会话存储.rb
中配置
expire\u after
参数

Sqore::Application.config.session_store(
  :cookie_store,
  key: '_name_session',
  expire_after: 24.hours
)

将此添加到应用程序控制器:

before_filter :session_expires, :except => [:login, :logout]
before_filter :update_session_time, :except => [: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

不,海报明确表示他不想这样做,因为它可以在客户端被篡改。回答很好。文档在这里:如果您有子域,请添加
domain::all
。如果您想更一般一些,可以使用
Rails.application.config.session\u store
。请注意,此解决方案在默认情况下无法与Rails 4.1及更高版本兼容。cookie序列化程序现在默认为JSON,因此时间对象存储为字符串。
session[:expires\u at]。to\u Time
将起作用可能更典型的用法是在预选的非活动期后使会话过期,而不是因为原始过期时间已过而突然出现。但这似乎并没有(明确地)涵盖这样的用例。将第二行作为
放在应用程序控制器的\u操作之前,而不是作为登录操作的一部分,可以解决这个问题。。。好。。他们是什么。我很高兴能为你的问题找到一个好的答案,因为我完全理解为什么你会对仍然存在的东西感到困惑,即使是在最新的“边缘”中。。