7

サーバーへのjson呼び出しを行う既存のレールバックエンドWebサイトがあります。現在、同じバックエンドを使用して json で呼び出しを送信するモバイル iOS アプリを開発しています。ただし、モバイル リクエストは次のエラーで失敗します。

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を取得します

// 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 に答える