Rails 3使用Authlogic并调用reset_session

时间:2012-09-04 12:07:22

标签: ruby-on-rails ruby-on-rails-3 session authlogic session-fixation

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

2 个答案:

答案 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专家。我不希望你接受这个答案,因为我没有专业知识来真的回答它,只是分享我的想法,以防它帮助你,并给你一些关于如何思考的指示关于它。