Rails authenticity_token auf einem Formular vs csrf-Token

8

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?

    
thebravoman 10.08.2016, 10:35
quelle

1 Antwort

0

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:

  1. Der Attributwert "content" von <meta name="csrf-param" /> wird von request_forgery_protection_token und standardmäßig :authenticity_token .

  2. 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:

  1. Diese versteckte Eingabe wird von extra_tags_for_form zurückgegeben Methode.
  2. Inside extra_tags_for_form ruft token_tag Methode.
  3. Die Methode token_tag verwendet das Token als Argument.
  4. 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:

  1. :remote => true sollte in options von form_tag .
  2. übergeben werden
  3. embed_authenticity_token_in_remote_forms config ist auf false gesetzt.
  4. authenticity_token wurde nicht in options .
  5. übergeben
  

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 .

    
Maksim Kalmykov 01.08.2017 17:05
quelle