7

我有一个现有的 Rails 后端网站,它对服务器进行 json 调用。现在,我正在开发一个移动 iOS 应用程序以使用相同的后端并以 json 格式发送呼叫。但是,移动请求因以下原因而失败:

WARNING: Can't verify CSRF token authenticity

在 stackoverflow 周围搜索,许多人建议使用以下方法禁用对 json 调用的 csrf 检查:

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

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

4

3 回答 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 预防备忘单 ,您可以检查引用者以确保其来自您信任的域。如果引用者为空,则它可能源自 https url,因此应视为失败。依赖 Ruby 的 CSRF 令牌是一种更强的 CSRF 保护形式。

于 2012-05-20T22:19:11.390 回答
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);
   }
});
于 2012-06-06T09:06:48.313 回答
0

您可以采取的一种方法是保留 CSRF 检查,但根据存在的 http 标头禁用。如果您的 json 请求有 JWT 令牌,您可以在相关控制器中执行类似的操作。

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

表单提交将无法设置 http 标头,因此 csrf 将对其进行保护。

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

于 2019-03-02T21:03:37.880 回答