RoR安全指南指出,您应该使用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
为了参考,这是我目前的方法:
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
根据中的建议,在成功登录后仍然执行对reset_session的调用http://guides.rubyonrails.org/security.html#session-固定对策
是的,在用户登录后重置会话(这看起来是什么情况?)肯定是不对的。你想在用户登录之前完成。
理想情况下,你会想在用户登录之前完成这项操作,但前提是登录确实会成功——但我不确定你是否能让auth_logic来完成这项工作,我对auth_logic没有太多经验,尽管这对auth_log来说是一个非常好的问题,如果我是你,我会将其作为auth_logc的支持票证提交。
但与此同时,您可能只想尝试将reset_session
放在操作方法的顶部,放在@user_session = current_client.user_sessions.new(params[:user_session])
之前。我认为这会起作用,更糟糕的是,在某些情况下,如果你真的不必重置会话(如果用户的凭据无效),但我不认为
但再说一遍,这里不是一个授权专家。我不希望你接受这个答案,因为我没有真正回答这个问题的专业知识,只是分享我的想法,以防它对你有帮助,并给你一些如何思考的建议。