2017-02-24 26 views
0

セッションをRedisに移行するときに開始されたCSRFトークンに問題があります。問題は、ユーザーがログアウトしてログイン画面を長時間放置することです。一晩中その後、午前中に、redisセッションがサーバー(TTL)から削除されたため、CSRFトークンの形式がもう無効であるため、最初のログイン試行は常に失敗します。セッションが期限切れになった後、CSRFトークンの真正性を検証できません - Rails + devise + redis

私は数時間オンラインで検索しましたが、何が正しいかわかりません。このファイルを追加すると、問題を解決します

class SessionsController < Devise::SessionsController 
    skip_before_filter :require_no_authentication, only: [:new] 
end 

read online、これはセキュリティ上のリスクは何かから。新鮮なトークン を取得するために、サーバから新しいトークンを返し、再送信フォーム

  • をフォームを送信する前に、AjaxのGET呼び出しを行う、

    • 失敗した上:私は探し続け、いくつかの選択肢を見て
    • トークンをログインコントローラの要求ヘッダーに追加する

    セキュリティリスクを正しく理解していれば、どのような方法でセキュリティ問題が解決されるのかわかりません。つまり、保護されていないログインAPIのリスクは、攻撃者が他のユーザーを騙して攻撃者のプロフィールにサインインしてプライベートデータを入力し、攻撃者が利用できるようにすることです。したがって、これらのソリューションのいずれかを使用すると、攻撃者は同じ動作を模倣して自分自身をハックすることができますか?

    この問題を解決する最も安全な方法は何ですか?

  • 答えて

    0

    新しいトークンを取得するためにAPIを追加し、ログインフォームが長時間開いていた場合に使用するように修正しました。コード:

    アプリ/コントローラ/ my_controller.rb:

    def token 
        render json: { token: form_authenticity_token }, status: :ok 
    end 
    

    signin.html:

    $('form#login').submit(function(e) { 
        var that = this; 
        e.preventDefault(); 
        // assuming the session TTL is 30 min 
        if (new Date() - window.loginPageRenderedAt > 1800000) { 
         $.get('token', function(data) { 
         var token = data.token; 
         $('input[name=authenticity_token]').val(token) 
         that.submit(); 
         }).fail(function() { 
         that.submit(); 
         }) 
        } else { 
         this.submit(); 
        } 
    } 
    
    関連する問題