4

RoR Security Guide指出,您應該「使用reset_session方法來對付會話固定時,」發出一個新的會話標識符並聲明成功登錄後無效的舊會話標識符「。帶有Authlogic和調用reset_session的Rails 3

使用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 

回答

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

+0

成功登錄後,依然表現正如我們推薦的reset_session什麼是加入'「CURRENT_USER」點=> {}'到temp_session? – mikong

+0

這樣做是爲了清空會話中「current_user」鍵的內容 –

0

是啊,當你登錄的用戶(這是什麼樣子發生了什麼?)復位會話肯定是不對的。你想在你登錄用戶之前做到這一點。

理想情況下,你想在你登錄用戶之前做到這一點,但只有當登錄實際上會成功 - 但我不知道如果你可以得到auth_logic來做到這一點,我對auth_logic並不是很有經驗,儘管這對auth_logic來說是一個很好的問題,如果我是你,我會用auth_logic將它作爲支持票證。

但在此期間,你可能想只是嘗試把reset_session在操作方法的頂部@user_session = current_client.user_sessions.new(params[:user_session])。我認爲這將工作,並在更糟的情況下重置會話在某些情況下,你真的不必(如果用戶的憑據無效),但我不認爲這將導致嚴重的問題。 (嗯,哦,除非它導致你失去你的驗證錯誤?)

但是,不是一個auth_logic專家在這裏。我不希望你接受這個答案,因爲我沒有的專業知識,真的回答它,只是分享我的想法,以防萬一它幫助你,並給你一些關於如何思考它的指示。