安全性可以为json rails调用禁用csrf令牌?

问题描述 投票:6回答:3

我有一个现有的rails后端网站,它使json调用服务器。现在,我正在开发一个移动iOS应用程序,以使用相同的后端并在json中发送调用。但是,移动请求失败了:

WARNING: Can't verify CSRF token authenticity

搜索stackoverflow,许多人建议通过使用这样的方法禁用csrf检查json调用:

# Or this in your application_controller.rb
def verified_request?
  if request.content_type == "application/json"
    true
  else
    super()
  end
end

但我的问题是,我不明白这是如何防止json格式的csrf攻击?攻击者总是可以从他们的站点向我们的端点发送json请求。任何人都有这方面的见解?我找不到任何明确的答案。

ios security ruby-on-rails-3.1
3个回答
2
投票

您正在描述的内容很容易使用Flash:

        var request:URLRequest = new URLRequest("http://stackoverflow.com"); 
        request.requestHeaders.push(new URLRequestHeader('Content-Type', 'application/json'));      
        request.data = unescape('{"a":1,"b":{"c":3}}');
        request.method = URLRequestMethod.POST;
        navigateToURL(request, '_blank');   

如果您查看CSRF prevention cheat sheet,您可以检查引用来确保它来自您信任的域。如果引用者为空,那么它可能来自https url,因此应该被视为失败。依赖Ruby的CSRF令牌是CSRF保护的一种更强大的形式。


1
投票

这是ajax的修复

从rails获取csrf_token或者从meta获取其他内容

// js file
var csrf_token = $('meta[name=csrf-token]').attr('content');

要么

//js.erb file
var csrf_token = "<%= request.session["<%= _csrf_token %>"] %>";

然后将其添加到js

$("body").bind("ajaxSend", function(elm, xhr, s){
   if (s.type == "POST") {
    // place lines mentioned above here
    // line goes here...
    xhr.setRequestHeader('X-CSRF-Token', csrf_token);
   }
});

0
投票

您可以采取的一种方法是保留CSRF检查,但基于存在的http标头禁用。如果你的json请求有一个JWT令牌,你可以在相关的控制器中做这样的事情。

protect_from_forgery with: :exception, unless: -> { some_auth_token.valid? }

表单提交将无法设置http标头,因此csrf将防止它。

你json请求应该有一个Authorization标头是安全的。

© www.soinside.com 2019 - 2024. All rights reserved.