RoR Security Guide表示您应该“在成功登录后发出新会话标识符并声明旧会话标识符无效”,使用reset_session方法来对抗会话固定。
使用Authlogic时,我无法找到有关调用reset_session的任何指导。是否只是在控制器方法中包含该方法的情况(如下所示)?
我只关心为Authlogic造成问题,因为在调用reset_session之前,我可以在会话哈希中看到user_credentials和user_credentials_id键和值。
class UserSessionsController < ApplicationController
def create
@user_session = current_client.user_sessions.new(params[:user_session])
if @user_session.save
reset_session
flash[:success] = I18n.t(:msg_login_success)
redirect_back_or_default application_root_path
else
render :action => :new
end
end
答案 0 :(得分:1)
作为参考,这是我目前的方法:
def create
@user_session = current_client.user_sessions.new(params[:user_session])
if @user_session.save
# reset session to counter session fixation
# whilst retaining values except for those that the application has created specific to the current user
temp_session = session.merge("current_user" => {}).clone
reset_session
session.reverse_merge!(temp_session)
# set flash msg and redirect
flash[:success] = I18n.t(:msg_login_success)
redirect_back_or_default application_root_path
else
render :action => :new
end
end
根据http://guides.rubyonrails.org/security.html#session-fixation-countermeasures
中的建议,在成功登录后仍然执行reset_session调用答案 1 :(得分:0)
是的,在您登录用户之后重置会话(这看起来像是在发生什么?)绝对是不对的。您希望在将用户登录之前执行此操作。
理想情况下,您希望在登录用户之前执行此操作,但前提是登录实际上是成功的 - 但我不确定您是否可以使用auth_logic来执行此操作,我不是很经验丰富的auth_logic,虽然这对auth_logic来说是一个非常好的问题,如果我是你,我会把它作为auth_logic的支持票据提交。
但与此同时,您可能只想尝试将reset_session
放在 @user_session = current_client.user_sessions.new(params[:user_session])
之前的操作方法的顶部。我认为这会起作用,更糟糕的是在你真正没有必要的情况下重置会话(如果用户的凭据无效),但我不认为这将导致严重的问题。 (呃 - 哦,除非它导致你失去验证错误?)
但同样,这里不是auth_logic专家。我不希望你接受这个答案,因为我没有专业知识来真的回答它,只是分享我的想法,以防它帮助你,并给你一些关于如何思考的指示关于它。