Rails登录重置会话

Cal*_*bHC 17 security session ruby-on-rails

最好的做法是在用户成功登录时调用reset_session,并在用户注销时再次调用它?这样做会有副作用/问题吗?

rbh*_*ock 15

Ruby on Rails的安全指南建议,认证成功后复位会话ID,以防止会话固定漏洞.从本质上讲,会话固定涉及攻击者设置您的会话ID(或其他一些方法,当您点击登录页面时能够知道ID是什么),并且,在您成功进行身份验证后,攻击者使用自己的浏览器设置cookie您的会话ID,随后随身份验证.成功进行身份验证后重置会话ID可以完全缓解此类漏洞.您的创建操作中的一些示例代码可能如下所示:

def create
  user =  User.find_by_email(params[:email])
  if user && user.authenticate(params[:password])
    temp_session = session.dup
    reset_session
    session.replace(temp_session)
    session[:athlete_id] = athlete.id
    redirect_to root_url, notice: "Authentication successful!"
  else
    flash.now.alert = "Invalid credentials"
    render "new"
  end
end
Run Code Online (Sandbox Code Playgroud)

请注意,如果您希望保留任何数据,则在重置会话之前复制会话非常重要.

至于在注销时调用reset_session,是的,这也是最佳实践.

  • 在Rails 5中,`session.replace`将不再起作用.但是,您可以使用`old_values = session.to_hash`获取旧值,并使用`session.update(old_values)`将它们恢复到新会话. (3认同)
  • 不,你是对的。我不确定它有什么危害。让我们将其更改为 `old_values = session.to_hash` 和 `session.update old_values.except('session_id')`。 (2认同)

Mbl*_*ake 12

这实际上取决于您如何在会话中存储内容以及您希望安全性如何运行.

重置会话将丢弃用户会话中的所有内容,因此如果他们跳回登录屏幕并重新登录但仍然(例如)存储到其会话中的购物车,您将清除可能不合需要的内容.

如果您没有存储任何您认为用户可能想要保留的数据,我知道没有理由在处理登录尝试之前清除会话会对您造成伤害,我建议您注销.


Jef*_*son 9

我认为在用户登录时重置会话是一种好习惯.这样,恶意个人无法在客户端连接加密之前嗅出会话cookie,并且在使用https上的登录表单后仍然使用它.尝试:

temp = session
reset_session
session.reverse_merge!(temp)
Run Code Online (Sandbox Code Playgroud)

这样,session获取reset_session生成的新值,但任何其他会话变量保持不变.