在JSON响应中返回CSRF令牌

时间:2012-07-24 00:30:39

标签: ruby-on-rails session csrf

我正在构建一个应用程序,它将(希望)处理会话创建并销毁JSON。目前,我发现这样做的最好方法是让Rails返回form_authentication_token作为对登录成功的JSON响应的一部分,即(在我的Api :: SessionsController中):

def create
  @user = User.find_for_authentication(email: params[:email])

  if @user && @user.valid_password?(params[:password])
    sign_in(@user)
    render json: { success: true, token: form_authenticity_token }
  else
    render json: { success: false, errors: ['Invalid email or password'] }, status: 401
  end
end

然而,我对CSRF相关安全性的了解并不足以让人知道这是不是一件坏事。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:5)

我认为这应该是一件安全的事情。 Same Origin策略应该保护您免受恶意站点的攻击,该恶意站点能够执行您的某个用户的CSRF登录,并随后从响应中窃取令牌。浏览器不会向其他域上的主机提交JSON请求。

JSON劫持(http://haacked.com/archive/2009/06/24/json-hijacking.aspx)之类的东西在理论上是可行的(虽然它已经在我所知道的所有浏览器中打了补丁),但是假设以下情况,也应该减轻威胁:

  • 您只能在创建操作
  • 中返回令牌
  • 此操作只能通过帖子请求
  • 进行访问