4

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
4

2 回答 2

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

于 2013-01-14T14:41:00.353 回答
0

是的,在您登录用户后重置会话(这看起来像发生了什么?)绝对是不对的。您想在用户登录之前执行此操作。

理想情况下,您希望在登录用户之前执行此操作,但前提是登录实际上会成功 - 但我不确定您是否可以让 auth_logic 做到这一点,我对 auth_logic 不是很有经验,虽然这对于 auth_logic 来说是一个非常好的问题,但如果我是你,我会将它作为支持票提交给 auth_logic。

但与此同时,您可能只想尝试将 放在操作方法reset_session顶部before @user_session = current_client.user_sessions.new(params[:user_session])。我认为这会起作用,更糟糕的是在某些情况下您确实不需要重置会话(如果用户的凭据无效),但我认为这不会导致严重问题。(嗯,哦,除非它导致您丢失验证错误?)

但同样,这里不是 auth_logic 专家。我不希望您接受这个答案,因为我没有真正回答它的专业知识,只是分享我的想法以防万一它对您有所帮助并为您提供一些关于如何思考它的指示。

于 2012-11-04T21:33:58.323 回答