2

私のアプリにはUserモデルがあり、rememberable_token列があります。ユーザーを作成すると、ランダムなセキュア文字列がフィルターに保存されbefore_create、ユーザーのセキュア トークンとして機能します。

user.rememberable_token = SecureRandom.urlsafe_base64

logoutセッション コントローラーでは、そのトークンの値を使用して永続的な Cookie を作成し、ユーザーがブラウザーを閉じてもログアウトされず、アクションを介してログアウトした場合にのみログアウトされるようにします。

セッションコントローラー:

def create
  .
  .
  cookies.permanent.signed[:permanent_user_session] = user.rememberable_token
end

def logout  
  cookies.delete :permanent_user_session
  redirect_to root_url  
end

Cookie は、現在のユーザーが存在するかどうかを判断するためにアプリケーション コントローラーで使用されるほか、いくつかのコントローラーでユーザーがログインして認証されているかどうかを判断するために使用される before_filter で使用されます。

アプリケーションコントローラー

def current_user  
  @current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session]
end

def authorize
  unless User.find_by_rememberable_token(cookies.signed[:permanent_user_session])
    render :action => 'login'
  end
end

問題は、これが安全なのか、それともセッション ハイジャックされやすいのかということです。ハイジャックされやすい場合、session#logoutメソッドで、既存の Cookie を削除する直前にユーザー用の新しい rememberable_token を作成した場合 (ただし、その値で新しい Cookie を作成しない場合) は問題ありませんか?

ありがとうございました。

4

2 に答える 2

1

誰かがCookieを盗んでいる場合、このコードは次のとおりです。

def current_user  
 @current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session]
end

引き続き機能します。ログアウト方法では、ユーザーテーブルからトークンを削除し、ログイン時に再作成する必要があります。

基本的に、作成時に行っていることは、ログインごとに実行し、ログアウトごとに元に戻す必要があります。

于 2013-02-06T13:04:30.683 に答える
0

私はおそらくこれを行うだろう:

セッション作成時:

random_string = SecureRandom.urlsafe_base64
cookies.permanent.signed[:permanent_user_session] = random_string   
user.rememberable_token = Digest::MD5.hexdigest(random_string) && user.save

セッションの破棄時:

cookies.delete :permanent_user_session

アプリケーションコントローラーで:

def current_user  
  @current_user ||= User.find_by_rememberable_token(Digest::MD5.hexdigest(cookies.signed[:permanent_user_session])) if cookies.signed[:permanent_user_session]
end

def authorize
  unless @current_user
    render :action => 'login'
  end
end

このようにして、トークンのハッシュを保存し、新しいログインごとに新しいハッシュが再生成されます (ログアウトするたびに期限切れになります)。Rails は CSRF を処理しますが、長期のセッションはおそらく良い考えではありません。

于 2013-02-06T14:02:59.363 に答える