Auf derselben Seite einer Rails 4 App habe ich ein
im Kopf:
%Vor%und unten im Körper:
%Vor%Das csrf-Token wird für js-Aufrufe benötigt. Aber warum unterscheidet sich das Form-Token vom csrf-Token? Welcher der beiden Token wird beim Senden des Formulars verwendet?
Ich habe einige Nachforschungen angestellt, um Ihre Frage zu beantworten, und hier sind die Ergebnisse.
Sehen wir uns zuerst diesen Teil an:
%Vor%Dieser Teil wird mit der Methode csrf_meta_tags erstellt . Aus dem Quellcode können wir sehen:
Der Attributwert "content" von <meta name="csrf-param" />
wird von request_forgery_protection_token und standardmäßig :authenticity_token
.
Der Attributwert "content" von <meta name="csrf-token" />
wird von form_authenticity_token Methode, wobei das Token entweder aus der Sitzung übernommen oder generiert wird.
Sehen wir uns nun diesen Teil an:
%Vor%Von der Quelle können wir das sehen:
extra_tags_for_form
ruft token_tag token_tag
verwendet das Token als Argument. token
Argument für token_tag
wurde zuvor aus options
Argument von form_tag Methode in html_options_for_form Methode. Wenn Sie also authenticity_token
param in options
nicht manuell auf Ihr benutzerdefiniertes Token gesetzt haben und die Bedingungen nicht erfüllt haben, die dazu führten, dass token
value auf false gesetzt wurde (wird weiter unten erwähnt), token_tag
Methode erhält nil
und ruft dieselbe auf form_authenticity_token -Methode, die für die Erstellung des <meta name="csrf-token" />
-Tags verwendet wird. By the way, zum Füllen name
Attribut der Eingabe verwendet es auch request_forgery_protection_token , das verwendet wird, wenn <meta name="csrf-param" />
-Taggenerierung auftritt.
Und da dies alles während derselben Anfrage geschieht, sollte der Aufruf der Methode form_authenticity_token
in beiden Fällen das gleiche Ergebnis liefern.
Welcher der beiden Token wird beim Senden des Formulars verwendet?
Beim Senden des Formulars wird das Token aus der versteckten Eingabe verwendet.
Token von <meta />
kann auch verwendet werden, aber nur wenn alle unter Bedingungen (die das token
Argument der Methode token_tag
auf false setzen) wird erfüllt:
:remote => true
sollte in options
von form_tag
. embed_authenticity_token_in_remote_forms
config ist auf false gesetzt. authenticity_token
wurde nicht in options
. Aber warum unterscheidet sich das Form-Token vom csrf-Token?
Bei dieser Frage tritt dieses Problem möglicherweise aufgrund von Caching auf. Oder, wenn Sie Turbolinks Gem verwenden, könnte dies zu diesem Problem führen (Sie können dies überprüfen, wenn Sie die Seite vollständig aktualisieren und die Token erneut vergleichen). Weitere Informationen zum Problem mit Turbolinks finden Sie in diese Frage .
Tags und Links ruby-on-rails csrf authenticity-token