AVVISO: imansible verificare le guide di autenticità del token CSRF

Sto inviando i dati dalla vista al controller con AJAX e ho ricevuto questo errore:

ATTENZIONE: non è ansible verificare l’autenticità del token CSRF

Penso di dover inviare questo token con i dati.

Qualcuno sa come posso fare questo?

Modifica: la mia soluzione

L’ho fatto inserendo il seguente codice all’interno del post AJAX:

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

Dovresti fare questo:

  1. Assicurati di avere <%= csrf_meta_tag %> nel tuo layout

  2. Aggiungi prima beforeSend a tutte le richieste beforeSend per impostare l’intestazione come di seguito:


 $.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); } }); 

Per inviare token in tutte le richieste puoi usare:

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

Il modo migliore per farlo è in realtà utilizzare <%= form_authenticity_token.to_s %> per stampare direttamente il token nel codice del tuo binario. Non è necessario utilizzare javascript per cercare nella dom il token csrf come altri post menzionati. basta aggiungere l’opzione delle intestazioni come di seguito;

 $.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) %>" }) 

Se ricordo male, devi aggiungere il seguente codice al tuo modulo, per eliminare questo problema:

 <%= token_tag(nil) %> 

Non dimenticare il parametro.

Passare da una vecchia app a una rails 3.1, incluso il meta tag csrf, non lo risolve ancora. Sul blog di rubyonrails.org, forniscono alcuni suggerimenti per l’aggiornamento e in particolare questa linea di jQuery che dovrebbe andare nella sezione principale del layout:

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

tratto da questo post del blog: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .

Nel mio caso, la sessione veniva reimpostata su ogni richiesta Ajax. L’aggiunta del codice precedente ha risolto il problema.

In effetti il ​​modo più semplice. Non preoccuparti di cambiare le intestazioni.

Assicurati di avere:

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

Basta fare un campo di input nascosto in questo modo:

  

O se vuoi un post 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); } }); 
  1. Assicurati di avere <%= csrf_meta_tag %> nel tuo layout
  2. Aggiungi un beforeSend per includere il token csrf nella richiesta ajax per impostare l’intestazione. Questo è richiesto solo per le richieste post .

Il codice per leggere il token csrf è disponibile nelle rails/jquery-ujs , quindi imho è più semplice utilizzarlo come segue:

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

Ho solo pensato di colbind questo articolo perché l’articolo ha la maggior parte della risposta che stai cercando ed è anche molto interessante

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

Le risposte votate in alto qui sono corrette ma non funzioneranno se si stanno eseguendo richieste tra domini perché la sessione non sarà disponibile a meno che non dica esplicitamente a jQuery di passare il cookie di sessione. Ecco come farlo:

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

Puoi scriverlo globalmente come di seguito.

JS normale:

 $(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'))} }); }); 

Script di caffè:

  $('#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')) } 

oops ..

Ho perso la seguente riga nel mio application.js

 //= require jquery_ujs 

L’ho sostituito e il suo funzionamento ..

======= AGGIORNATO =========

Dopo 5 anni, sono tornato con lo stesso errore, ora ho nuovissimo Rails 5.1.6 , e ho trovato questo post di nuovo. Proprio come un cerchio di vita.

Ora, qual è il problema: Rails 5.1 ha rimosso il supporto per jquery e jquery_ujs per impostazione predefinita e aggiunto

 //= require rails-ujs in application.js 

Fa le seguenti cose:

  1. forzare i dialoghi di conferma per varie azioni;
  2. effettuare richieste non GET da collegamenti ipertestuali;
  3. creare moduli o collegamenti ipertestuali inviare dati in modo asincrono con Ajax;
  4. i pulsanti di invio diventano automaticamente disabilitati sul modulo di invio per evitare il doppio clic. (da: https://github.com/rails/rails-ujs/tree/master )

Ma perché non include il token csrf per una richiesta Ajax? Se qualcuno lo sa in dettaglio, commentami. Lo apprezzo.

Comunque ho aggiunto quanto segue nel mio file js personalizzato per farlo funzionare (Grazie per le altre risposte che mi aiutano a raggiungere questo codice):

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

Se stai usando javascript con jQuery per generare il token nel tuo modulo, questo funziona:

  

Ovviamente, devi avere <%= csrf_meta_tag %> nel tuo layout Ruby.

Se non si utilizza jQuery e si utilizza qualcosa come API di recupero per le richieste, è ansible utilizzare quanto segue per ottenere il 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) }) 

Utilizzare jquery.csrf ( https://github.com/swordray/jquery.csrf ).

  • Rotaie 5.1 o successive

     $ yarn add jquery.csrf 
     //= require jquery.csrf 
  • Rails 5.0 o versioni precedenti

     source 'https://rails-assets.org' do gem 'rails-assets-jquery.csrf' end 
     //= require jquery.csrf 
  • Codice sorgente

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

Per quelli di voi che hanno bisogno di una risposta non jQuery si può semplicemente aggiungere quanto segue:

 xmlhttp.setRequestHeader ('X-CSRF-Token', $ ('meta [nome = "csrf-token"]'). attr ('contenuto'));

Un esempio molto semplice può essere indicato qui:

 xmlhttp.open ( "POST", "example.html", true);
 xmlhttp.setRequestHeader ('X-CSRF-Token', $ ('meta [nome = "csrf-token"]'). attr ('contenuto'));
 xmlhttp.send ();

se qualcuno ha bisogno di aiuto relativo a Uploadify e Rails 3.2 (come me quando ho cercato su Google questo post), questa app di esempio potrebbe essere utile: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb

controlla anche la soluzione del controller in questa app

Sto usando Rails 4.2.4 e non riuscivo a capire perché stavo ottenendo:

 Can't verify CSRF token authenticity 

Ho nel layout:

 <%= csrf_meta_tags %> 

Nel controller:

 protect_from_forgery with: :exception 

Invocando tcpdump -A -s 999 -i lo port 3000 stava mostrando l’intestazione impostata (nonostante non fosse necessario impostare le intestazioni con ajaxSetup – era già fatto):

 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 

Alla fine non funzionava perché avevo i cookie spenti. CSRF non funziona senza che i cookie siano abilitati, quindi questa è un’altra ansible causa se vedi questo errore.

Ho lottato con questo problema per giorni. Qualsiasi chiamata GET funzionava correttamente, ma tutti i PUT generano un errore “Imansible verificare l’autenticità del token CSRF”. Il mio sito web funzionava bene fino a quando non avevo aggiunto un certificato SSL a nginx.

Alla fine sono incappato in questa linea mancante nelle mie impostazioni di 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; } 

Dopo aver aggiunto la riga mancante “proxy_set_header X-Forwarded-Proto https;”, tutti gli errori del token CSRF si sono interrotti.

Speriamo che questo aiuti qualcun altro che sta battendo la testa contro un muro. haha