安全的安全来禁用CSRF令牌的JSON轨道电话?

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

WARNING: Can't verify CSRF token authenticity 

search周围的stackoverflow,许多人build议禁用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请求到我们的端点。 任何人都有这方面的见解? 我找不到任何明确的答案。

你所描述的很容易利用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预防备忘单,您可以检查引荐者以确保其来自您信任的域。 如果引用者是空白的,那么它可能来自https url,所以应该被认为是失败的。 依靠Ruby的CSRF令牌是CSRF保护的更强大的forms。

这是对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); } });