在JSON响应中返回CSRF令牌

cle*_*lem 3 session ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

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

rbh*_*ock 5

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

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

  • 您只能在create动作中返回令牌
  • 此操作只能通过邮寄请求访问