J'envoie des données de la vue au contrôleur avec AJAX et j'ai eu cette erreur:
AVERTISSEMENT: impossible de vérifier l'authenticité du jeton CSRF
Je pense que je dois envoyer ce jeton avec des données.
Est-ce que quelqu'un sait comment faire cela?
Edit: Ma solution
J'ai fait cela en mettant le code suivant dans le message AJAX:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
ruby-on-rails
jquery
csrf
kbaccouche
la source
la source
Réponses:
Vous devriez faire ceci:
Assurez-vous que vous avez
<%= csrf_meta_tag %>
dans votre mise en pageAjoutez
beforeSend
à toutes les requêtes ajax pour définir l'en-tête comme ci-dessous:Pour envoyer un jeton dans toutes les demandes, vous pouvez utiliser:
la source
La meilleure façon de le faire est en fait simplement d'utiliser
<%= form_authenticity_token.to_s %>
pour imprimer le jeton directement dans votre code de rails. Vous n'avez pas besoin d'utiliser javascript pour rechercher le token csrf dans le dom comme d'autres articles le mentionnent. ajoutez simplement l'option en-têtes comme ci-dessous;la source
Si je me souviens bien, vous devez ajouter le code suivant à votre formulaire, pour vous débarrasser de ce problème:
N'oubliez pas le paramètre.
la source
<%= token_tag(nil) %>
. Ensuite, vous obtenez le jeton généré automatiquement.En effet le moyen le plus simple. Ne vous embêtez pas à changer les en-têtes.
Assurez-vous que vous avez:
Faites simplement un champ de saisie caché comme ceci:
Ou si vous voulez un article jQuery ajax:
la source
La mise à niveau d'une ancienne application vers rails 3.1, y compris la balise Meta csrf ne le résout toujours pas. Sur le blog rubyonrails.org, ils donnent quelques conseils de mise à niveau, et en particulier cette ligne de jquery qui devrait aller dans la section tête de votre mise en page:
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 demande ajax. L'ajout du code ci-dessus a résolu ce problème.
la source
<%= csrf_meta_tag %>
dans votre mise en pagebeforeSend
pour inclure le jeton csrf dans la demande ajax pour définir l'en-tête. Ceci n'est requis que pour lespost
demandes.Le code pour lire le jeton csrf est disponible dans le
rails/jquery-ujs
, donc à mon humble avis, il est plus facile de simplement l'utiliser, comme suit:la source
headers: { 'X-CSRF-Token': Rails.csrfToken() }
Je pensais simplement que je lierais cela ici car l'article contient la plupart de la réponse que vous recherchez et c'est aussi 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/
la source
Les réponses les plus votées ici sont correctes mais ne fonctionneront pas si vous effectuez des demandes interdomaines car la session ne sera pas disponible à moins que vous ne demandiez explicitement à jQuery de passer le cookie de session. Voici comment procéder:
la source
Vous pouvez l'écrire globalement comme ci-dessous.
JS normal:
Script de café:
la source
Oups..
J'ai raté la ligne suivante dans mon application.js
Je l'ai remplacé et son fonctionnement ..
======= MISE À JOUR =========
Après 5 ans, je suis de retour avec la même erreur, maintenant j'ai de nouveaux Rails 5.1.6 , et j'ai retrouvé ce post. Tout comme le cercle de la vie.
Maintenant, quel était le problème: Rails 5.1 a supprimé la prise en charge de jquery et jquery_ujs par défaut, et a ajouté
Il fait les choses suivantes:
Mais pourquoi n'inclut-il pas le jeton csrf pour la demande ajax? Si quelqu'un le sait en détail, commentez-moi. J'apprécie ça.
Quoi qu'il en soit, j'ai ajouté ce qui suit dans mon fichier js personnalisé pour le faire fonctionner (merci pour les autres réponses pour m'aider à atteindre ce code):
la source
jquery_ujs
. C'était ça l'astuce.Si vous n'utilisez pas jQuery et utilisez quelque chose comme fetch API pour les requêtes, vous pouvez utiliser ce qui suit pour obtenir
csrf-token
:document.querySelector('meta[name="csrf-token"]').getAttribute('content')
la source
Utilisez jquery.csrf ( https://github.com/swordray/jquery.csrf ).
Rails 5.1 ou version ultérieure
Rails 5.0 ou avant
Code source
la source
//= require jquery.csrf
ne marchera pas, non?. Au lieu de cela, j'ai utilisé le fichier pack js avecimport 'jquery.csrf'
. Notez que vous n'avez pas besoin de l'inclure avec une balise pack dans vos vues.Si vous utilisez javascript avec jQuery pour générer le jeton dans votre formulaire, cela fonctionne:
De toute évidence, vous devez avoir le
<%= csrf_meta_tag %>
dans votre disposition Ruby.la source
Pour ceux d'entre vous qui ont besoin d'une réponse non jQuery, vous pouvez simplement ajouter ce qui suit:
Un exemple très simple peut être trouvé ici:
la source
J'ai eu du mal avec ce problème pendant des jours. Tout appel GET fonctionnait correctement, mais tous les PUT génèreraient une erreur «Impossible de vérifier l'authenticité du jeton CSRF». Mon site Web fonctionnait bien jusqu'à ce que j'aie ajouté un certificat SSL à nginx.
Je suis finalement tombé sur cette ligne manquante dans mes paramètres nginx:
Après avoir ajouté la ligne manquante "proxy_set_header X-Forwarded-Proto https;", toutes mes erreurs de jeton CSRF se terminent.
J'espère que cela aide quelqu'un d'autre qui se bat aussi la tête contre un mur. haha
la source
si quelqu'un a besoin d'aide concernant Uploadify et Rails 3.2 (comme moi quand j'ai googlé ce post), cet exemple d'application peut être utile: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb
vérifiez également la solution du contrôleur dans cette application
la source
J'utilise Rails 4.2.4 et je n'ai pas pu comprendre pourquoi je recevais:
J'ai dans la mise en page:
Dans le contrôleur:
Invoquer
tcpdump -A -s 999 -i lo port 3000
montrait l'en-tête en cours de définition (bienajaxSetup
qu'il n'ait pas besoin de définir les en-têtes avec - c'était déjà fait):En fin de compte, cela a échoué car j'avais désactivé les cookies. CSRF ne fonctionne pas sans l'activation des cookies, c'est donc une autre cause possible si vous voyez cette erreur.
la source