2017-02-24 87 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(); 
    } 
} 
相关问题