Ich hatte das gleiche Problem, aber mit Seiten, die zwischengespeichert wurden. Die Seiten wurden mit einem veralteten Authentizitätstoken gepuffert, und alle Aktionen mit den Methoden post / put / delete wurden als Fälschungsversuche erkannt. Der Fehler (422 Unprocessable Entity) wurde an den Benutzer zurückgegeben.
Die Lösung für Rails 3:
Hinzufügen:
skip_before_filter :verify_authenticity_token
oder als "sagivo" in Rails 4 hervorgehoben:
skip_before_action :verify_authenticity_token
Auf Seiten, die Caching durchführen.
Wie @toobulkeh kommentierte dies ist keine Schwachstelle auf :index
, :show
Aktionen, aber mit diesem auf Vorsicht :put
, :post
Aktionen.
Beispielsweise:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Referenz: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Hinweis hinzugefügt von barlop-Rails 4.2 veralteter skip_before_filter zugunsten von skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "Die * _filter-Methodenfamilie wurde aus der Dokumentation entfernt. Von ihrer Verwendung wird zugunsten der * _action abgeraten Methodenfamilie "
Für Rails 6 (wie "collimarco" hervorhob) können Sie es verwenden skip_forgery_protection
und es ist sicher, es für eine REST-API zu verwenden, die keine Sitzungsdaten verwendet.
skip_before_action :verify_authenticity_token
:index, :show
Aktionen. Aber seien Sie vorsichtig, wenn Sie dies in die:put, :post
Tat umsetzen!Für mich fehlte die Ursache für dieses Problem unter Rails 4,
Zeile in meinem Hauptanwendungslayout. Ich hatte es versehentlich gelöscht, als ich mein Layout neu schrieb.
Wenn dies nicht im Hauptlayout enthalten ist, benötigen Sie es auf jeder Seite, auf der Sie ein CSRF-Token möchten.
quelle
Es gibt verschiedene Ursachen für diesen Fehler (in Bezug auf Schienen 4).
1. Überprüfen Sie das
<%= csrf_meta_tags %>
Vorhandensein im Seitenlayout.2. Überprüfen Sie, ob bei AJAX-Aufrufen ein Authentizitätstoken gesendet wird, wenn Sie den
form_for
Helfer mitremote: true
Option verwenden. Wenn nicht, können Sie die Zeile<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
mit dem Formularblock einfügen.3. Wenn eine Anfrage von einer zwischengespeicherten Seite gesendet wird, verwenden Sie das Fragment-Caching , um einen Teil der Seite auszuschließen, die eine Anfrage sendet, z
button_to
. B. usw. Andernfalls ist das Token veraltet / ungültig.Ich würde den CSR-Schutz nur ungern aufheben ...
quelle
Nur das Hinzufügen des
authenticity_token
In-Formulars hat es für mich behoben.quelle
Das Authentizitätstoken ist ein zufälliger Wert, der aus Ihrer Sicht generiert wird, um zu beweisen, dass eine Anfrage von einem Formular auf Ihrer Website gesendet wurde, nicht von einem anderen Ort. Dies schützt vor CSRF-Angriffen:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
Überprüfen Sie, wer dieser Client / diese IP ist. Es sieht so aus, als würden sie Ihre Site verwenden, ohne Ihre Ansichten zu laden.
Wenn Sie weiter debuggen müssen, ist diese Frage ein guter Ausgangspunkt: Grundlegendes zum Rails-Authentizitätstoken
Zur Erklärung bearbeitet: Dies bedeutet, dass sie die Aktion zum Verarbeiten Ihres Formulars aufrufen, ohne Ihr Formular jemals auf Ihrer Website zu rendern. Dies kann böswillig sein (z. B. das Versenden von Spam-Kommentaren) oder auf einen Kunden hinweisen, der versucht, Ihre Webdienst-API direkt zu verwenden. Sie sind der einzige, der dies anhand der Art Ihres Produkts und der Analyse Ihrer Anfragen beantworten kann.
quelle
ActionController::InvalidAuthenticityToken
kann auch durch einen falsch konfigurierten Reverse-Proxy verursacht werden. Dies ist der Fall, wenn in der Stapelverfolgung eine Linie angezeigt wirdRequest origin does not match request base_url
.Wenn Sie einen Reverse-Proxy (z. B. nginx) als Empfänger für eine HTTPS-Anforderung verwenden und die Anforderung unverschlüsselt an das Backend (z. B. die Rails-App) senden, erwartet das Backend (genauer gesagt: Rack) einige Header mit mehr Informationen zur ursprünglichen Clientanforderung um verschiedene Verarbeitungsaufgaben und Sicherheitsmaßnahmen anwenden zu können.
Weitere Details finden Sie hier: https://github.com/rails/rails/issues/22965 .
TL; DR: Die Lösung besteht darin, einige Header hinzuzufügen:
quelle
Zu spät, um zu antworten, aber ich habe die Lösung gefunden.
Wenn Sie Ihr eigenes HTML-Formular definieren, fehlt eine Authentifizierungs-Token-Zeichenfolge, die aus Sicherheitsgründen an den Controller gesendet werden sollte. Wenn Sie jedoch Rails Form Helper verwenden, um ein Formular zu generieren, erhalten Sie so etwas wie Folgendes
Die Lösung des Problems besteht also darin, entweder das Feld authenticity_token hinzuzufügen oder Schienen von Hilfsprogrammen zu verwenden, anstatt Schienen zu entfernen, herunterzustufen oder zu aktualisieren.
quelle
Wenn Sie eine
rake rails:update
oder eine andere kürzlich vorgenommene Änderung vorgenommen habenconfig/initializers/session_store.rb
, ist dies möglicherweise ein Symptom für alte Cookies im Browser. Hoffentlich geschieht dies in dev / test (es war für mich), und Sie können einfach alle Browser-Cookies löschen, die sich auf die betreffende Domain beziehen.Wenn dies in Produktion ist und Sie es geändert haben
key
, sollten Sie es zurücksetzen, um die alten Cookies zu verwenden (<- nur Spekulation).quelle
Ich hatte dieses Problem mit Javascript-Aufrufen. Ich habe das behoben, indem ich nur jquery_ujs in die Datei application.js benötigte.
quelle
Wir hatten das gleiche Problem, stellten jedoch fest, dass es sich nur um Anfragen mit http: // und nicht mit https: // handelte. Die Ursache war
secure: true
für session_store:Behoben durch Verwendung von HTTPS ~ überall :)
quelle
rails s
(Nicht-SSL) anstelle des SSL-Endpunkts begegnet, den ich für die Entwicklung eingerichtet habe. Erst als ich Ihren Kommentar las, wurde mir klar, was ich tat. Nachdem ich wieder SSL verwendet hatte, funktionierten die Dinge wieder. Vielen Dank!secure: true
schrieb ichsecure: !Rails.env.development?
Für Schienen 5 ist es besser, die hinzuzufügen,
protect_from_forgery prepend: true
als die zu überspringenverify_authentication_token
quelle
Hinzufügen
im
quelle
Ich hatte dieses Problem und der Grund war, dass ich einen Controller kopiert und in meine App eingefügt habe. Ich musste ändern
ApplicationController
zuApplicationController::Base
quelle
Ich hatte das gleiche Problem bei localhost. Ich habe die Domain für die App geändert, aber in der URL- und Hosts-Datei befand sich noch die alte Domain. Die Lesezeichen und die Hosts-Datei meines Browsers wurden aktualisiert, um eine neue Domain zu verwenden. Jetzt funktioniert alles einwandfrei.
quelle
Vielleicht haben Sie Ihr NGINX-Setup für HTTPS, aber Ihre Zertifikate sind ungültig? Ich hatte in der Vergangenheit ein ähnliches Problem und die Umleitung von http zu https löste das Problem
quelle
Ich habe überprüft, ob <% = csrf_meta_tags%> vorhanden sind, und das Löschen von Cookies im Browser hat für mich funktioniert.
quelle
Nach den Empfehlungen von Chrome Lighthouse für ein schnelleres Laden der Anwendung habe ich mein Javascript asynchronisiert:
views/layout/application.html.erb
Dies hat alles kaputt gemacht und den Token-Fehler für meine Remote-Formulare erhalten. Durch Entfernen wurde
async: true
das Problem behoben.quelle
Diese Antwort ist viel spezifischer für Ruby on Rails, aber hoffentlich hilft sie jemandem.
Sie müssen das CSRF-Token in jede Nicht-GET-Anforderung aufnehmen. Wenn Sie an die Verwendung von JQuery gewöhnt sind, verfügt Rails über eine Hilfsbibliothek, die
jquery-ujs
darauf aufbaut und einige versteckte Funktionen hinzufügt. Eines der Dinge, die es tut, ist automatisch das CSRF-Token in jedeajax
Anfrage aufzunehmen. Siehe hier .Wenn Sie wie ich davon abweichen, haben Sie möglicherweise einen Fehler. Sie können das Token einfach manuell senden oder eine andere Bibliothek verwenden, um das Token aus dem DOM zu entfernen. Weitere Informationen finden Sie in diesem Beitrag .
quelle
In Schienen 5 müssen 2 Codezeilen hinzugefügt werden
quelle
Installieren
kann helfen
quelle
Problem durch Herabstufung von 2.3.8 auf 2.3.5 gelöst. (sowie das berüchtigte Problem "Sie werden umgeleitet.")
quelle