Rails 3.1 – CSRF ignoré?

voici mon problème,

J’ai une application rails 3.1 et j’essaie de faire une demande ajax mais le message d’avertissement “AVERTISSEMENT: impossible de vérifier l’authenticité du jeton CSRF”…

Dans ma mise en page, j’ai la méthode d’assistance csrf_method_tag” , et j’ajoute le code javascript suivant (je ne sais pas si c’est vraiment requirejs ou non):

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

Mon Gemfile contient la gem jquery-rails (> = 1.0.12) et jquery a besoin de jquery & jquery-ujs en haut de mon application.js.

Même avec cela, le message apparaît toujours. Ai-je oublié quelque chose?

Merci pour ton aide.

Ce qui a fonctionné pour moi – lorsque je travaille sans formulaires – est d’inclure le résultat de <%= form_authenticity_token %> dans la charge utile de données ajax. Donc, je fais quelque chose comme ce qui a été suggéré par tehprofessor dans le code HTML:

  

puis dans le javascript:

 tokentag = $('#tokentag').val() submitdata = { "authenticity_token": tokentag, ...+whatever else you need to include+...} 

puis appelez le $.ajax avec submitdata .

J’ai eu exactement ce même problème. J’essayais d’attraper un événement javascript (lecteur you_tube terminé) et Ajax sur mon serveur pour me le faire savoir. Je devenais:

  AVERTISSEMENT: impossible de vérifier l'authenticité du jeton CSRF 

chaque fois que l’appel ajax jQuery frappe mon serveur. J’ai ajouté votre correctif de code ci-dessus

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

et ça marche bien. Je pense que la seule différence est dans ma mise en page que j’ai

 <%= csrf_meta_tags %> 

et pas csrf_method_tag ​​comme vous l’avez mentionné dans votre message d’origine.
Donc, merci pour le correctif, il était dans le post original.

Vous n’avez probablement même pas besoin de cela dans votre code. Le gem jquery-rails définit automatiquement le jeton CSRF sur toutes les demandes Ajax par défaut.

Faites-le directement sur votre appel AJAX et tout fonctionnera correctement!

  $.ajax({ type: //method, beforeSend: function(xhr){ xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')) }, url: //parameter, dataType: 'html', success: function(data, textStatus, jqXHR) { // some code } }); 

Avez-vous essayé d’utiliser un élément de formulaire masqué avec un jeton d’authenticité?

  

J’avais la même erreur et cela l’a résolue. C’est parce que je n’utilisais pas les aides de forme intégrées …

Une des raisons peut être que vous passez un appel AJAX avant le chargement du document, de sorte que JQuery ne peut pas obtenir de jeton CSRF.

Le problème est que vous devez extraire un nouveau jeton après une demande Ajax POST, car une fois utilisé, le jeton est invalidé. Voici le code pour faire ceci:

Dans les rails chaque fois qu’une réponse POST est envoyée, ajoutez ces parameters à la réponse:

 def someMethod: result[:csrfParam] = request_forgery_protection_token result[:csrfToken] = form_authenticity_token render :json => result end 

Maintenant, côté JS, dans la fonction de réussite de chaque méthode POST, vous pouvez appeler cette fonction:

 var setCsrfToken = function(param, token) { if(param == null || token == null) { console.error("New CSRF param/token not present"); } $("input[name='" + param + "']").val(token); } 

comme ça:

 setCsrfToken(result["csrfParam"], result["csrfToken"]); 

Cette fonction réinitialisera tous les parameters authenticity_token de tous les formulaires POST, de sorte que la requête suivante contienne un jeton valide. Vous devez vous assurer que cela se produit à chaque appel POST, sinon vous continuerez à faire face à ce problème.

En outre, CSRF n’est pas destiné à empêcher le détournement de clics, il s’agit d’une attaque distincte dans laquelle un autre site Web peut amener un utilisateur à cliquer sur un lien qui exécute une action sur votre site Web avec la session de l’utilisateur.