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