Rails登录重置会话
当用户成功登录时调用reset_session并在用户注销时再次调用它是最佳做法吗? 这样做会有副作用/问题吗?
这实际上取决于您如何在会话中存储内容以及您希望安全性如何运行。
重置会话将丢弃用户会话中的所有内容,因此如果他们跳回到登录屏幕并重新登录但仍然(例如)存储到其会话中的购物车,您将清除可能不合需要的内容。
如果您没有存储任何您认为用户可能想要保留的数据,我知道没有理由在处理登录尝试之前清除会话会对您造成伤害,我建议您注销。
Ruby on Rails安全指南建议在成功进行身份validation后重置会话ID,以防止会话固定漏洞。 从本质上讲,会话固定涉及攻击者设置您的会话ID(或其他一些方法,当您点击登录页面时能够知道ID是什么),并且,在您成功进行身份validation后,攻击者使用自己的浏览器设置cookie您的会话ID,随后将作为您的身份validation。 成功进行身份validation后重置会话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
请注意,如果您希望保留任何数据,则在重置会话之前复制会话非常重要。
至于在注销时调用reset_session,是的,这也是最佳实践。
我认为在用户登录时重置会话是一种好习惯。这样,恶意个人无法在客户端连接加密之前嗅出会话cookie,并且在使用https上的登录表单后仍然使用它。 尝试:
temp = session reset_session session.reverse_merge!(temp)
这样,session获取reset_session生成的新值,但任何其他会话变量保持不变。
由于Rails API的变化,这里的许多答案都没有很好的老化,所以我只留下一个至少在Rails 5.0中起作用的一个。
正如其他人所说,Rails安全指南建议在登录时调用reset_session
以避免会话固定攻击。
您可能希望在登录时清除会话,但如果您只是想更改会话ID并保留其他所有内容(即没有副作用),您可以这样做:
def mitigate_session_fixation old_values = session.to_hash reset_session session.update old_values.except('session_id') end