Wie kann ich das CSRF-Token abrufen, das mit einer JSON-Anforderung übergeben werden soll?
Ich weiß, dass Rails aus Sicherheitsgründen das CSRF-Token für alle Anforderungstypen (einschließlich JSON / XML) überprüft .
Ich könnte meinen Controller einsetzen skip_before_filter :verify_authenticity_token
, aber ich würde den CRSF-Schutz verlieren (nicht ratsam :-)).
Diese ähnliche (immer noch nicht akzeptierte) Antwort schlägt vor
Rufen Sie den Token mit ab
<%= form_authenticity_token %>
Die Frage ist wie? Muss ich eine meiner Seiten zum ersten Mal aufrufen, um das Token abzurufen, und dann meine echte Authentifizierung mit Devise durchführen? Oder handelt es sich um eine einmalige Information, die ich von meinem Server abrufen und dann konsistent verwenden kann (bis ich sie manuell auf dem Server selbst ändere)?
quelle
protect_from_forgery with: :null_session, :if => Proc.new { |c| c.request.format == 'application/json' }
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
2) Unabhängig von dieser Frage, aber im Zusammenhang mit dem Thema POSTing JSON von iOS, habe ichAFNetworking
Folgendesmanager.requestSerializer = [AFJSONRequestSerializer serializer];
Sie können das CSRF-Token nach erfolgreicher Anmeldung mithilfe eines benutzerdefinierten Headers senden.
Fügen Sie dies beispielsweise in Ihre Sitzungen ein. # Create:
Beispiel für einen Anmeldeantwort-Header mit dem CSRF-Token:
Dieses Token ist gültig, bis Sie sich erneut anmelden oder (abmelden, wenn Sie dies über Ihre API unterstützen). Ihr Client kann das Token aus den Anmeldeantwort-Headern extrahieren und speichern. Dann muss jede POST / PUT / DELETE-Anforderung den X-CSRF-Token-Header auf den Wert setzen, der zum Zeitpunkt der Anmeldung empfangen wurde.
Beispiel für POST-Header mit dem CSRF-Token:
Dokumentation: form_authenticity_token
quelle
In der Tat einfachster Weg. Machen Sie sich nicht die Mühe, die Überschriften zu ändern.
Stell sicher dass du hast:
in deinem
layouts/application.html.erb
Machen Sie einfach ein verstecktes Eingabefeld wie folgt:
Oder wenn Sie einen jquery Ajax-Beitrag wünschen:
Wenn Sie Ihre JSON-Daten veröffentlichen, fügen Sie den Daten einfach ein gültiges Feld authenticity_token hinzu,
post
und die Warnung sollte verschwinden ...quelle
= token_tag(nil)
Ich habe diesen Fehler folgendermaßen behoben:
Quelle: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
quelle
protect_from_forgery with: :exception, unless: -> { request.format.json? }
und es hat bei mir funktioniert. Vielen Dank.Was besorgniserregend ist, ist, dass wir in Rails 3.2.3 jetzt die CSRF-Warnung in Production.log erhalten, aber der Beitrag schlägt nicht fehl! Ich möchte, dass es fehlschlägt, da es mich vor Angriffen schützt. Und Sie können das csrf-Token mit jquery hinzufügen, bevor Sie übrigens filtern:
http://jasoncodes.com/posts/rails-csrf-vulnerability
quelle
Ich habe das folgende verwendet. Verwenden Sie include? Wenn der Inhaltstyp application / json; charset = utf-8 ist, funktioniert er immer noch.
quelle
Diese Antwort ist besser.
Sie können die CSRF-TOKEN-Validierung ohne zusätzlichen Aufwand (das Token wird angehängt) beibehalten, bevor XMLHttpRequest gesendet wird. Keine JQuery, nichts, nur Kopieren / Einfügen und Aktualisieren.
Fügen Sie einfach diesen Code hinzu.
quelle
Ich hatte das gleiche Problem mit der folgenden Version von Rails:
gem 'Rails' ,: git => 'git: //github.com/rails/rails.git' ,: branch => '3-2-Stable'
Ich habe auf 3.2.2 aktualisiert und jetzt funktioniert alles gut für mich. :)
Edelstein 'Schienen', '3.2.2'
quelle
WARNING: Can't verify CSRF token authenticity
Ich bin heute Abend auf dasselbe Problem gestoßen. Der Grund dafür ist, dass die Anmeldung beim letzten csrf-Token nicht mehr gültig ist. Was ich getan habe war:
$("meta[name=csrf-token]").attr('content', '<%= form_authenticity_token %>');
in Ihrer App / views / devise / session / create.js.rb.Jetzt hat es ein gültiges csrf-Token :) Ich hoffe es hilft
quelle
Auch für den Entwicklungs- / Testmodus.
Diese Warnung
:null_session
wird angezeigt , weil Sie in Rails 4.1 standardmäßig arbeiten, wenn keinewith:
Optionen angegeben sind.quelle