Ich sende mit AJAX Daten von der Ansicht an den Controller und habe folgende Fehlermeldung erhalten:
WARNUNG: Die Authentizität des CSRF-Tokens kann nicht überprüft werden
Ich denke, ich muss dieses Token mit Daten senden.
Weiß jemand, wie ich das machen kann?
Edit: Meine Lösung
Dazu habe ich den folgenden Code in den AJAX-Beitrag eingefügt:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
ruby-on-rails
jquery
csrf
kbaccouche
quelle
quelle
Antworten:
Du solltest das tun:
Stellen Sie sicher, dass Sie
<%= csrf_meta_tag %>
in Ihrem Layout habenFügen Sie
beforeSend
zu allen Ajax-Anforderungen hinzu, um den Header wie folgt festzulegen:So senden Sie Token in allen Anforderungen, die Sie verwenden können:
quelle
Der beste Weg, dies zu tun, besteht
<%= form_authenticity_token.to_s %>
darin, das Token direkt in Ihrem Rails-Code auszudrucken. Sie müssen kein Javascript verwenden, um den Dom nach dem csrf-Token zu durchsuchen, wie in anderen Posts erwähnt. Fügen Sie einfach die Header-Option wie folgt hinzu.quelle
Wenn ich mich richtig erinnere, müssen Sie Ihrem Formular den folgenden Code hinzufügen, um dieses Problem zu beheben:
Vergessen Sie den Parameter nicht.
quelle
<%= token_tag(nil) %>
. Dann erhalten Sie das automatisch generierte Token.In der Tat einfachster Weg. Machen Sie sich nicht die Mühe, die Überschriften zu ändern.
Stell sicher dass du hast:
Machen Sie einfach ein verstecktes Eingabefeld wie folgt:
Oder wenn Sie einen jQuery Ajax-Beitrag wünschen:
quelle
Ein Upgrade von einer älteren App auf Rails 3.1, einschließlich des csrf-Meta-Tags, löst es immer noch nicht. Auf dem rubyonrails.org-Blog geben sie einige Upgrade-Tipps, insbesondere diese Abfragezeile, die im Kopfbereich Ihres Layouts enthalten sein sollte:
entnommen aus diesem Blog-Beitrag: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .
In meinem Fall wurde die Sitzung bei jeder Ajax-Anforderung zurückgesetzt. Durch Hinzufügen des obigen Codes wurde dieses Problem behoben.
quelle
<%= csrf_meta_tag %>
in Ihrem Layout habenbeforeSend
, um das csrf-Token in die Ajax-Anforderung zum Festlegen des Headers aufzunehmen. Dies ist nur fürpost
Anfragen erforderlich .Der Code zum Lesen des csrf-Tokens ist im verfügbar
rails/jquery-ujs
, daher ist es imho am einfachsten, ihn wie folgt zu verwenden:quelle
headers: { 'X-CSRF-Token': Rails.csrfToken() }
Ich dachte nur, ich würde dies hier verlinken, da der Artikel die meisten Antworten enthält, die Sie suchen, und es ist auch sehr interessant
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/
quelle
Die Antworten mit der höchsten Bewertung sind korrekt, funktionieren jedoch nicht, wenn Sie domänenübergreifende Anforderungen ausführen , da die Sitzung nur verfügbar ist, wenn Sie jQuery ausdrücklich anweisen, das Sitzungscookie zu übergeben. So geht's:
quelle
Sie können es global wie unten schreiben.
Normales JS:
Kaffeeskript:
quelle
Hoppla..
Ich habe die folgende Zeile in meiner application.js verpasst
Ich habe es ersetzt und es funktioniert ..
======= AKTUALISIERT =========
Nach 5 Jahren bin ich mit dem gleichen Fehler zurück, jetzt habe ich brandneue Rails 5.1.6 und ich habe diesen Beitrag wiedergefunden. Genau wie der Kreislauf des Lebens.
Das Problem war nun: Rails 5.1 entfernte standardmäßig die Unterstützung für jquery und jquery_ujs und fügte hinzu
Es macht die folgenden Dinge:
Aber warum ist das csrf-Token für eine Ajax-Anfrage nicht enthalten? Wenn jemand dies im Detail weiß, kommentiere mich einfach. Ich weis das zu schätzen.
Wie auch immer, ich habe Folgendes in meine benutzerdefinierte js-Datei eingefügt, damit es funktioniert (Vielen Dank für andere Antworten, die mir helfen, diesen Code zu erreichen):
quelle
jquery_ujs
. Das war der Trick.Wenn Sie jQuery nicht verwenden und für Anforderungen eine Abruf- API verwenden, können Sie Folgendes verwenden, um Folgendes abzurufen
csrf-token
:document.querySelector('meta[name="csrf-token"]').getAttribute('content')
quelle
Verwenden Sie jquery.csrf ( https://github.com/swordray/jquery.csrf ).
Schienen 5.1 oder höher
Schienen 5.0 oder früher
Quellcode
quelle
//= require jquery.csrf
nicht funktionieren, oder? Stattdessen habe ich die Pack-JS-Datei verwendetimport 'jquery.csrf'
. Beachten Sie, dass Sie dies nicht mit einem Pack-Tag in Ihre Ansichten aufnehmen müssen.Wenn Sie Javascript mit jQuery verwenden, um das Token in Ihrem Formular zu generieren, funktioniert dies wie folgt:
Natürlich müssen Sie das
<%= csrf_meta_tag %>
in Ihrem Ruby-Layout haben.quelle
Für diejenigen unter Ihnen, die eine Nicht-jQuery-Antwort benötigen, können Sie einfach Folgendes hinzufügen:
Ein sehr einfaches Beispiel kann hier genannt werden:
quelle
Ich hatte tagelang mit diesem Problem zu kämpfen. Jeder GET-Aufruf funktionierte ordnungsgemäß, aber alle PUTs erzeugten den Fehler "CSRF-Token-Authentizität kann nicht überprüft werden". Meine Website funktionierte einwandfrei, bis ich nginx ein SSL-Zertifikat hinzugefügt hatte.
Ich bin schließlich auf diese fehlende Zeile in meinen Nginx-Einstellungen gestoßen:
Nach dem Hinzufügen der fehlenden Zeile "proxy_set_header X-Forwarded-Proto https;" werden alle meine CSRF-Token-Fehler beendet.
Hoffentlich hilft das jemand anderem, der auch seinen Kopf gegen eine Wand schlägt. Haha
quelle
Wenn jemand Hilfe im Zusammenhang mit Uploadify und Rails 3.2 benötigt (wie ich, als ich diesen Beitrag gegoogelt habe), kann diese Beispiel-App hilfreich sein: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb
Überprüfen Sie auch die Controller-Lösung in dieser App
quelle
Ich benutze Rails 4.2.4 und konnte nicht herausfinden, warum ich Folgendes bekam:
Ich habe im Layout:
In der Steuerung:
Beim Aufrufen
tcpdump -A -s 999 -i lo port 3000
wurde der gesetzte Header angezeigt (obwohl die Header nicht mit gesetzt werden musstenajaxSetup
- dies wurde bereits durchgeführt):Am Ende schlug es fehl, weil ich Cookies ausgeschaltet hatte. CSRF funktioniert nicht ohne aktivierte Cookies. Dies ist eine weitere mögliche Ursache, wenn dieser Fehler auftritt.
quelle