Ich habe einige Probleme mit dem Authentizitätstoken in Rails, wie ich es jetzt schon oft getan habe.
Aber ich möchte dieses Problem wirklich nicht einfach lösen und weitermachen. Ich würde das Authentizitätstoken wirklich gerne verstehen. Nun, meine Frage ist, haben Sie eine vollständige Informationsquelle zu diesem Thema oder würden Sie Ihre Zeit damit verbringen, dies hier ausführlich zu erklären?
ruby-on-rails
ruby
authenticity-token
Ricardo Acras
quelle
quelle
Antworten:
Was geschieht
Wenn der Benutzer ein Formular zum Erstellen, Aktualisieren oder Zerstören einer Ressource anzeigt, erstellt die Rails-App einen Zufall
authenticity_token
, speichert dieses Token in der Sitzung und platziert es in einem ausgeblendeten Feld im Formular. Wenn der Benutzer das Formular sendet, sucht Rails nach demauthenticity_token
, vergleicht es mit dem in der Sitzung gespeicherten und wenn es übereinstimmt, kann die Anforderung fortgesetzt werden.Warum es passiert
Da das Authentizitätstoken in der Sitzung gespeichert ist, kann der Client seinen Wert nicht kennen. Dies verhindert, dass Personen Formulare an eine Rails-App senden, ohne das Formular in dieser App selbst anzuzeigen. Stellen Sie sich vor, Sie verwenden Dienst A, Sie haben sich beim Dienst angemeldet und alles ist in Ordnung. Stellen Sie sich nun vor, Sie haben Service B verwendet und ein Bild gesehen, das Ihnen gefällt, und auf das Bild gedrückt, um es zu vergrößern. Wenn bei Service B ein böser Code vorhanden war, sendet er möglicherweise eine Anfrage an Service A (bei dem Sie angemeldet sind) und fordert Sie auf, Ihr Konto zu löschen, indem Sie eine Anfrage an senden
http://serviceA.com/close_account
. Dies wird als CSRF (Cross Site Request Forgery) bezeichnet .Wenn Dienst A Authentizitätstoken verwendet, ist dieser Angriffsvektor nicht mehr anwendbar, da die Anforderung von Dienst B nicht das richtige Authentizitätstoken enthalten würde und nicht fortgesetzt werden darf.
API-Dokumente beschreiben Details zum Meta-Tag:
Anmerkungen
Beachten Sie, dass Rails nur nicht idempotente Methoden überprüft (POST, PUT / PATCH und DELETE). GET-Anforderungen werden nicht auf Authentizitätstoken überprüft. Warum? Da in der HTTP-Spezifikation angegeben ist, dass GET-Anforderungen idempotent sind und keine Ressourcen auf dem Server erstellen, ändern oder zerstören sollten und die Anforderung idempotent sein sollte (wenn Sie denselben Befehl mehrmals ausführen, sollten Sie jedes Mal dasselbe Ergebnis erhalten).
Auch die eigentliche Implementierung ist, wie eingangs definiert, etwas komplizierter, um eine bessere Sicherheit zu gewährleisten. Rails gibt nicht bei jedem Formular das gleiche gespeicherte Token aus. Es wird auch nicht jedes Mal ein anderes Token generiert und gespeichert. Es generiert und speichert einen kryptografischen Hash in einer Sitzung und gibt jedes Mal, wenn eine Seite gerendert wird, neue kryptografische Token aus, die mit dem gespeicherten abgeglichen werden können. Siehe request_forgery_protection.rb .
Lektionen
Verwenden
authenticity_token
Sie diese Option, um Ihre nicht idempotenten Methoden (POST, PUT / PATCH und DELETE) zu schützen. Stellen Sie außerdem sicher, dass keine GET-Anforderungen zulässig sind, die möglicherweise Ressourcen auf dem Server ändern könnten.BEARBEITEN: Überprüfen Sie den Kommentar von @erturne bezüglich der idempotenten GET-Anforderungen. Er erklärt es besser als ich es hier getan habe.
quelle
Das Authentizitätstoken ist so konzipiert, dass Sie wissen, dass Ihr Formular von Ihrer Website gesendet wird. Es wird von dem Computer generiert, auf dem es ausgeführt wird, und verfügt über eine eindeutige Kennung, die nur Ihr Computer kennen kann. Auf diese Weise werden standortübergreifende Fälschungsangriffe verhindert.
Wenn Sie nur Probleme mit Rails haben, die Ihren AJAX-Skriptzugriff verweigern, können Sie verwenden
um das richtige Token beim Erstellen Ihres Formulars zu generieren.
Weitere Informationen finden Sie in der Dokumentation .
quelle
Was ist CSRF?
Das Authentizitätstoken ist eine Gegenmaßnahme zur Cross-Site Request Forgery (CSRF). Was ist CSRF?
Auf diese Weise kann ein Angreifer möglicherweise Sitzungen entführen, ohne die Sitzungstoken zu kennen.
Szenario :
CSRF-Lösung :
quelle
Minimales Angriffsbeispiel, das verhindert werden würde: CSRF
Auf meiner Website
evil.com
überzeuge ich Sie, das folgende Formular einzureichen:Wenn Sie über Sitzungscookies bei Ihrer Bank angemeldet sind, werden die Cookies gesendet und die Überweisung erfolgt, ohne dass Sie es überhaupt wissen.
Hier kommt der CSRF-Token ins Spiel:
Das Formular in einem authentischen Browser würde also folgendermaßen aussehen:
Daher würde mein Angriff fehlschlagen, da er den
authenticity_token
Parameter nicht gesendet hat , und ich hätte ihn auf keinen Fall erraten können, da es sich um eine riesige Zufallszahl handelt.Diese Verhinderungstechnik wird als Synchronizer-Token-Muster bezeichnet .
Gleiche Ursprungsrichtlinie
Was aber, wenn der Angreifer zwei Anfragen mit JavaScript gestellt hat, eine zum Lesen des Tokens und die zweite zum Übertragen?
Das Synchronizer-Token-Muster allein reicht nicht aus, um dies zu verhindern!
Hier kommt die Same Origin Policy zur Rettung, wie ich unter /security/8264/why-is-the-same-origin-policy-so-important/72569# erklärt habe 72569
Wie Rails die Token sendet
Behandelt bei: Rails: Wie funktioniert csrf_meta_tag?
Grundsätzlich:
HTML-Helfer
form_tag
fügen dem Formular gerne ein verstecktes Feld hinzu, wenn es sich nicht um ein GET-Formular handeltAJAX wird automatisch von jquery-ujs behandelt , das das Token aus den
meta
Elementen liest, die voncsrf_meta_tags
(in der Standardvorlage vorhanden) zu Ihrem Header hinzugefügt wurden , und es zu jeder gestellten Anforderung hinzufügt.uJS versucht auch, das Token in Formularen in veralteten zwischengespeicherten Fragmenten zu aktualisieren.
Andere Präventionsansätze
X-Requested-With
.Origin
Headers: /security/91165/why-is-the-synchronizer-token-pattern-preferred-over-the-origin-header-check-toquelle
Das Authentizitätstoken wird verwendet, um Cross-Site Request Forgery-Angriffe (CSRF) zu verhindern. Um das Authentizitätstoken zu verstehen, müssen Sie zuerst CSRF-Angriffe verstehen.
CSRF
Angenommen, Sie sind der Autor von
bank.com
. Sie haben auf Ihrer Website ein Formular, mit dem Sie mit einer GET-Anfrage Geld auf ein anderes Konto überweisen können:Ein Hacker könnte einfach eine HTTP-Anfrage an den Server senden und sagen
GET /transfer?amount=$1000000&account-to=999999
, richtig?Falsch. Der Angriff der Hacker wird nicht funktionieren. Der Server wird grundsätzlich denken?
Woher weiß der Server das? Weil es kein
session_id
Cookie gibt, das den Anforderer authentifiziert.Wenn Sie sich mit Ihrem Benutzernamen und Passwort anmelden, setzt der Server ein
session_id
Cookie in Ihrem Browser. Auf diese Weise müssen Sie nicht jede Anfrage mit Ihrem Benutzernamen und Passwort authentifizieren. Wenn Ihr Browser dassession_id
Cookie sendet , weiß der Server:Ein Hacker könnte denken:
Der Browser des Benutzers hat eine Reihe von Cookies für die
bank.com
Domain gesetzt. Jedes Mal, wenn der Benutzer eine Anfrage an diebank.com
Domain stellt, werden alle Cookies mitgesendet. Einschließlich dessession_id
Cookies.Wenn ein Hacker Sie dazu bringen könnte , die GET-Anfrage zu stellen, mit der Geld auf sein Konto überwiesen wird, wäre er erfolgreich. Wie konnte er dich dazu bringen? Mit Cross Site Request Forgery.
Eigentlich ist es ziemlich einfach. Der Hacker könnte Sie einfach dazu bringen, seine Website zu besuchen. Auf seiner Website könnte er das folgende Bild-Tag haben:
Wenn der Browser des Benutzers auf dieses Bild-Tag stößt, sendet er eine GET-Anfrage an diese URL. Und da die Anfrage von seinem Browser kommt, werden alle damit verbundenen Cookies gesendet
bank.com
. Wenn sich der Benutzer kürzlich beibank.com
... angemeldet hat, wird dassession_id
Cookie gesetzt und der Server wird denken, dass der Benutzer 1.000.000 USD auf das Konto 999999 überweisen wollte!Das reicht nicht Was ist, wenn jemand dieses Bild auf Facebook veröffentlicht und es an Ihrer Wand erscheint? Was ist, wenn es in eine Site injiziert wird, die Sie mit einem XSS-Angriff besuchen?
Nicht wahr. Ein Formular, das eine POST-Anforderung sendet, kann dynamisch generiert werden. Hier ist das Beispiel aus dem Rails-Handbuch zur Sicherheit :
Authentizitätstoken
Wenn Sie
ApplicationController
dies haben:Diese:
Ist in diesem kompiliert:
Insbesondere wird folgendes erzeugt:
Wenn Rails zum Schutz vor CSRF-Angriffen das mit einer Anfrage gesendete Authentizitätstoken nicht sieht, wird die Anfrage nicht als sicher angesehen.
Woher soll ein Angreifer wissen, was dieser Token ist? Bei jeder Generierung des Formulars wird zufällig ein anderer Wert generiert:
Ein Cross Site Scripting (XSS) -Angriff - so geht das. Aber das ist eine andere Sicherheitslücke für einen anderen Tag.
quelle
Das
Authenticity Token
ist Verfahren zur Schiene zu verhindern ‚Cross-Site - Anfrage Fälschung (CSRF oder XSRF) Angriffe‘ .Vereinfacht ausgedrückt wird sichergestellt, dass die PUT / POST / DELETE-Anforderungen (Methoden zum Ändern von Inhalten) an Ihre Webanwendung vom Browser des Clients und nicht von einem Drittanbieter (einem Angreifer) gestellt werden, der Zugriff auf ein erstelltes Cookie hat auf der Client-Seite.
quelle
da
Authenticity Token
ist so wichtig, und in Rails 3.0+ können Sie verwendenerschaffen
irgendwo
quelle
XSS
auf der Anmeldeseite nicht für schändliche Zwecke, sondern eine neue Sitzung mit einem vorab ausgefüllten Benutzernamen zu erstellen. Jetzt weiß ich, dass ich nur verwenden kannvalue="token_value"
.Beachten Sie, dass der Authenticity Token-Mechanismus zu Rennbedingungen führen kann, wenn Sie mehrere gleichzeitige Anforderungen vom selben Client haben. In dieser Situation kann Ihr Server mehrere Authentizitätstoken generieren, wenn es nur eines geben sollte, und der Client, der das frühere Token in einem Formular empfängt, schlägt bei seiner nächsten Anforderung fehl, da das Sitzungscookie-Token überschrieben wurde. Es gibt eine Beschreibung dieses Problems und eine nicht ganz triviale Lösung hier: http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/
quelle
Methoden Wo
authenticity_token
erforderlichWarum es erforderlich ist
quelle
Was ist ein Authentifizierungstoken?
Dies ist eine zufällige Zeichenfolge, die von der Rails-Anwendung verwendet wird, um sicherzustellen, dass der Benutzer eine Aktion von der App-Seite anfordert oder ausführt, nicht von einer anderen App oder Site.
Warum ist ein authentication_token erforderlich?
Zum Schutz Ihrer App oder Site vor Fälschung von standortübergreifenden Anfragen.
Wie füge ich einem Formular ein authentication_token hinzu?
Wenn Sie ein Formular mit dem Tag form_for generieren, wird automatisch ein Authentifizierungstoken hinzugefügt, das Sie verwenden können
<%= csrf_meta_tag %>
.quelle