242 votes

WARNING : Impossible de vérifier l'authenticité des rails CSRF token.

J'envoie des données de la vue au contrôleur avec AJAX et j'ai obtenu cette erreur :

WARNING : Impossible de vérifier l'authenticité du jeton CSRF.

Je pense que je dois envoyer ce jeton avec les données.

Quelqu'un sait-il comment faire ?

Edit : Ma solution

J'ai fait cela en mettant le code suivant dans le post AJAX :

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

7 votes

Avez-vous <%= csrf_meta_tag %> dans l'en-tête de votre mise en page ?

0 votes

Oui, comme ça : <%= csrf_meta_tags %>

6 votes

Avez-vous jquery-rails des bibliothèques qui fournissent une fonctionnalité ajax côté client ?

388voto

Chau Hong Linh Points 1586

Vous devriez le faire :

  1. Assurez-vous que vous avez <%= csrf_meta_tag %> dans votre mise en page

  2. Ajouter beforeSend à toutes les requêtes ajax pour définir l'en-tête comme ci-dessous :


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

Pour envoyer le jeton dans toutes les demandes, vous pouvez utiliser :

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

5 votes

Merci ! Ça a marché pour moi comme un charme !

36 votes

La bibliothèque jQuery UJS fournie par l'équipe Rails ajoute automatiquement le jeton CSRF aux requêtes AJAX de jQuery. Le fichier README contient des instructions sur la façon de l'installer. github.com/rails/jquery-ujs/blob/master/src/rails.js#L91

1 votes

Notez que vous pouvez définir l'en-tête pour toutes les demandes à la fois avec la fonction $.ajaxSetup.

31voto

ADAM Points 2155

La meilleure façon de procéder est de simplement utiliser <%= form_authenticity_token.to_s %> pour imprimer le jeton directement dans votre code rails. Vous n'avez pas besoin d'utiliser javascript pour rechercher le jeton csrf dans le domaine comme le mentionnent d'autres articles. Il suffit d'ajouter l'option headers comme ci-dessous ;

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

7 votes

Au lieu de faire cela pour chaque commande ajax, vous pouvez ajouter en-têtes à $.ajaxSetup() .

1 votes

Je recommande plutôt d'utiliser cette réponse ...

17 votes

Je n'aime pas vraiment l'approche consistant à utiliser ERB dans le javascript.

22voto

auralbee Points 2433

Si je me souviens bien, vous devez ajouter le code suivant à votre formulaire, pour vous débarrasser de ce problème :

<%= token_tag(nil) %>

N'oubliez pas le paramètre.

8 votes

En fait, ça devrait l'être : <%= token_tag(nil) %> . Ensuite, vous obtenez le jeton généré automatiquement.

13voto

Danny Points 1459

La mise à niveau d'une ancienne application vers rails 3.1, y compris la balise méta csrf, ne résout toujours pas le problème. Sur le blog rubyonrails.org, ils donnent quelques conseils de mise à niveau, et plus particulièrement cette ligne de jquery qui devrait se trouver dans la section head de votre mise en page :

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

extrait de cet article de blog : http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .

Dans mon cas, la session était réinitialisée à chaque requête ajax. L'ajout du code ci-dessus a résolu ce problème.

6voto

sciritai Points 2723

Je me suis dit que j'allais mettre ce lien ici car l'article contient la plupart des réponses que vous cherchez et il est également très intéressant.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X