web-dev-qa-db-ja.com

警告:CSRFトークンの真正性証明書を検証できません

AJAXでビューからコントローラにデータを送信していますが、このエラーが発生しました。

警告:CSRFトークンの信憑性を確認できません

このトークンをデータと一緒に送信する必要があると思います。

誰もが私がこれを行うことができる方法を知っていますか?

編集:私の解決策

私はAJAX投稿の中に次のコードを入れることによってこれをしました:

headers: {
  'X-Transaction': 'POST Example',
  'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
230
kbaccouche

これをするべきです:

  1. レイアウトに<%= csrf_meta_tag %>があることを確認してください。

  2. 以下のようにヘッダを設定するためにすべてのajaxリクエストにbeforeSendを追加します。


$.ajax({ url: 'YOUR URL HERE',
  type: 'POST',
  beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
  data: 'someData=' + someData,
  success: function(response) {
    $('#someDiv').html(response);
  }
});

あなたが使用することができるすべての要求でトークンを送るために:

$.ajaxSetup({
  headers: {
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
  }
});
361
Chau Hong Linh

これを行う最良の方法は、実際には<%= form_authenticity_token.to_s %>を使用してトークンを直接Railsコードに出力することです。他の記事が述べているようにcsrfトークンのためにDOMを検索するのにjavascriptを使用する必要はありません。下記のようにheadersオプションを追加するだけです。

$.ajax({
  type: 'post',
  data: $(this).sortable('serialize'),
  headers: {
    'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
  },
  complete: function(request){},
  url: "<%= sort_widget_images_path(@widget) %>"
})
31
ADAM

私の記憶が正しければ、この問題を解決するには、フォームに次のコードを追加する必要があります。

<%= token_tag(nil) %>

パラメータを忘れないでください。

22
auralbee

本当に簡単な方法です。ヘッダーを変更しても気にしないでください。

あなたが持っていることを確認してください:

<%= csrf_meta_tag %> in your layouts/application.html.erb

隠された入力フィールドを以下のようにするだけです。

<input name="authenticity_token" 
               type="hidden" 
               value="<%= form_authenticity_token %>"/>

あるいは、jQueryのAjax投稿が必要な場合は、

$.ajax({     
    type: 'POST',
    url: "<%= someregistration_path %>",
    data: { "firstname": "text_data_1", "last_name": "text_data2", "authenticity_token": "<%= form_authenticity_token %>" },                                                                                  
    error: function( xhr ){ 
      alert("ERROR ON SUBMIT");
    },
    success: function( data ){ 
      //data response can contain what we want here...
      console.log("SUCCESS, data="+data);
    }
});
15

Csrfメタタグを含めて、古いアプリからRails 3.1にアップグレードしてもまだ解決していません。 rubyonrails.orgブログでは、いくつかのアップグレードのヒント、具体的にはあなたのレイアウトのヘッドセクションに入るべきjqueryのこの行を示しています。

$(document).ajaxSend(function(e, xhr, options) {
 var token = $("meta[name='csrf-token']").attr("content");
  xhr.setRequestHeader("X-CSRF-Token", token);
});

このブログ記事から取られた: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-Ruby-on-Rails

私の場合、セッションはajaxリクエストごとにリセットされていました。上記のコードを追加することでその問題は解決しました。

13
Danny
  1. レイアウトに<%= csrf_meta_tag %>があることを確認してください。
  2. ヘッダーを設定するためのajax要求にcsrf-tokenを含めるためのbeforeSendを追加します。これはpostリクエストにのみ必要です。

Csrf-tokenを読むためのコードはRails/jquery-ujsにありますので、次のようにそれを使うのが最も簡単です:

$.ajax({
  url: url,
  method: 'post',
  beforeSend: $.Rails.CSRFProtection,
  data: {
    // ...
  }
})
10
nathanvda

この記事にはあなたが探している答えのほとんどが含まれているので、ここでここにリンクさせることを考えていました。それはまた非常に興味深いものです。

http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/ =

6
sciritai

JQueryにセッションCookieを渡すように明示的に指示しない限り、セッションは利用できないため、ここでのトップ投票の回答は正しいですが、クロスドメインリクエストを実行している場合は機能しません。これを行う方法は次のとおりです。

$.ajax({ 
  url: url,
  type: 'POST',
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
  },
  xhrFields: {
    withCredentials: true
  }
});
6
Ben Lakey

以下のようにグローバルに書くことができます。

通常のJS:

$(function(){

    $('#loader').hide()
    $(document).ajaxStart(function() {
        $('#loader').show();
    })
    $(document).ajaxError(function() {
        alert("Something went wrong...")
        $('#loader').hide();
    })
    $(document).ajaxStop(function() {
        $('#loader').hide();
    });
    $.ajaxSetup({
        beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}
    });
});

コーヒースクリプト:

  $('#loader').hide()
  $(document).ajaxStart ->
    $('#loader').show()

  $(document).ajaxError ->
    alert("Something went wrong...")
    $('#loader').hide()

  $(document).ajaxStop ->
    $('#loader').hide()

  $.ajaxSetup {
    beforeSend: (xhr) ->
      xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
  }
5
Chezhian

おっとっと..

私は私のapplication.jsで次の行を逃しました

//= require jquery_ujs

私はそれとその作業を交換しました..

=======更新=========

5年後、私は同じエラーで戻ってきました、今私は真新しいRails 5.1.6を持っています、そして私は再びこの記事を見つけました。人生の輪のように。

問題は次のとおりです。Rails 5.1では、jqueryおよびのサポートが削除されました)jquery_ujsをデフォルトで追加

//= require Rails-ujs in application.js

以下のことを行います。

  1. さまざまなアクションの確認ダイアログを強制します。
  2. ハイパーリンクからGET以外のリクエストを行います。
  3. フォームやハイパーリンクがAjaxと非同期にデータを送信するようにする。
  4. ダブルクリックを防ぐためにフォーム送信時に送信ボタンを自動的に無効にします。 (from: https://github.com/Rails/rails-ujs/tree/master

しかし、なぜそれがajaxリクエスト用のcsrfトークンを含まないのですか?誰かがこれについて詳細に知っているならば、ただ私にコメントしてください。感謝します。

とにかく私はそれを動作させるために私のカスタムjsファイルに以下を追加しました(私がこのコードに達するのを助けるために他の答えをありがとう):

$( document ).ready(function() {
  $.ajaxSetup({
    headers: {
      'X-CSRF-Token': Rails.csrfToken()
    }
  });
  ----
  ----
});
4
Abhi

Jquery.csrf( https://github.com/swordray/jquery.csrf )を使用してください。

  • レール5.1以降

    $ yarn add jquery.csrf
    
    //= require jquery.csrf
    
  • 5.0以前のレール

    source 'https://Rails-assets.org' do
      gem 'Rails-assets-jquery.csrf'
    end
    
    //= require jquery.csrf
    
  • ソースコード

    (function($) {
      $(document).ajaxSend(function(e, xhr, options) {
        var token = $('meta[name="csrf-token"]').attr('content');
        if (token) xhr.setRequestHeader('X-CSRF-Token', token);
      });
    })(jQuery);
    
4
swordray

あなたのフォームにトークンを生成するためにjQueryと共にjavascriptを使用しているなら、これは動作します:

<input name="authenticity_token" 
       type="hidden" 
       value="<%= $('meta[name=csrf-token]').attr('content') %>" />

明らかに、あなたはあなたのRubyレイアウトに<%= csrf_meta_tag %>を持つ必要があります。

3
Tim Scollick

JQueryを使用しておらず、リクエストに fetch APIのようなものを使用している場合は、以下を使用してcsrf-tokenを取得できます。

document.querySelector('meta[name="csrf-token"]').getAttribute('content')

fetch('/users', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')},
    credentials: 'same-Origin',
    body: JSON.stringify( { id: 1, name: 'some user' } )
    })
    .then(function(data) {
      console.log('request succeeded with JSON response', data)
    }).catch(function(error) {
      console.log('request failed', error)
    })
3
svnm

あなたがjQuery以外の答えを必要としていないあなたのためにあなたは簡単に以下を追加することができます:

 xmlhttp.setRequestHeader( 'X-CSRF-Token'、$( 'meta [name = "csrf-token"]')。attr( 'content')); 

非常に単純な例はここで見られることができます:

 xmlhttp.open( "POST"、 "example.html"、true); 
 xmlhttp.setRequestHeader( 'X-CSRF-Token'、$( 'meta [name = "csrf-token] "] ')。attr(' content ')); 
 xmlhttp.send(); 
2
Mek

誰かがUploadifyとRails 3.2に関連した助けを必要とするなら(私がこの記事をグーグルしたときのように)、このサンプルアプリは役に立つかもしれません: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3 /blob/master/app/views/pictures/index.html.erb

このアプリのコントローラーソリューションもチェックしてください

1
equivalent8

私はこの問題に何日も苦労しました。どのGET呼び出しも正しく機能していましたが、すべてのPUTが「CSRFトークンの信頼性を検証できません」というエラーを生成しました。私のウェブサイトは私がnginxにSSL証明書を追加するまでは問題なく動作していました。

私はついに私のnginxの設定でこの行方不明の行につまずいた:

location @puma { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_Host; 
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto https;   # Needed to avoid 'WARNING: Can't verify CSRF token authenticity'
    proxy_pass http://puma; 
}

足りない行 "proxy_set_header X-Forwarded-Proto https;"を追加すると、私のCSRFトークンエラーはすべて終了します。

うまくいけば、これは他の誰かが壁に対して頭を叩いているのに役立ちます。はは

1
Hoffmann

私はRails 4.2.4を使用していますが、次のようになっている理由を理解できませんでした。

Can't verify CSRF token authenticity

私はレイアウトにあります:

<%= csrf_meta_tags %>

コントローラで:

protect_from_forgery with: :exception

tcpdump -A -s 999 -i lo port 3000を呼び出すと、設定されているヘッダーが表示されていました(ajaxSetupを使用してヘッダーを設定する必要はありませんが、既に行われています)。

X-CSRF-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
DNT: 1
Content-Length: 125
authenticity_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

結局、クッキーをオフにしていたので失敗しました。 CSRFはCookieが有効になっていないと機能しません。そのため、このエラーが表示された場合はこれも考えられる原因です。

0