2017-02-24 88 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(); 
    } 
} 
相關問題