Das Authentizitätstoken wird verwendet, um Cross-Site Request Forgery-Angriffe (CSRF) zu verhindern. Um das Authentizitäts-Token zu verstehen, müssen Sie zunächst CSRF-Angriffe verstehen.
CSRF
Angenommen, Sie sind der Autor von bank.com
. Sie haben ein Formular auf Ihrer Website, das dazu dient, mit einer GET-Anfrage Geld auf ein anderes Konto zu überweisen:
![enter image description here]()
Ein Hacker könnte einfach eine HTTP-Anfrage an den Server senden mit den Worten GET /transfer?amount=$1000000&account-to=999999
richtig?
![enter image description here]()
Falsch. Der Hackerangriff wird nicht funktionieren. Der Server wird grundsätzlich denken?
Hm? Wer ist dieser Typ, der versucht, einen Transfer zu initiieren. Der Kontoinhaber ist es nicht, das ist sicher.
Woher weiß der Server das? Weil es keine session_id
Cookie zur Authentifizierung des Antragstellers.
Wenn Sie sich mit Ihrem Benutzernamen und Passwort anmelden, setzt der Server eine session_id
Cookie in Ihrem Browser. Auf diese Weise müssen Sie sich nicht bei jeder Anfrage mit Ihrem Benutzernamen und Passwort authentifizieren. Wenn Ihr Browser die session_id
Cookie, weiß der Server:
Oh, das ist John Doe. Er hat sich vor 2,5 Minuten erfolgreich angemeldet. Er ist einsatzbereit.
Ein Hacker könnte denken:
Hm. Eine normale HTTP-Anfrage wird nicht funktionieren, aber wenn ich das in die Finger kriegen könnte session_id
Keks, dann wäre ich glücklich.
Der Browser des Benutzers hat eine Reihe von Cookies für die bank.com
Bereich. Jedes Mal, wenn der Benutzer eine Anfrage an die bank.com
Domain werden alle Cookies mitgeschickt. Einschließlich der session_id
Keks.
Wenn also ein Hacker in der Lage wäre Sie um die GET-Anfrage zu stellen, die Geld auf sein Konto überweist, wäre er erfolgreich. Wie könnte er Sie dazu verleiten? Mit Cross Site Request Forgery.
Eigentlich ist es ganz einfach. Der Hacker könnte Sie einfach dazu bringen, seine Website zu besuchen. Auf seiner Website könnte er das folgende Bild-Tag verwenden:
<img src="http://bank.com/transfer?amount=$1000000&account-to=999999">
Wenn der Browser des Benutzers auf dieses Bild-Tag stößt, wird er eine GET-Anfrage an diese URL stellen. Und da die Anfrage von seinem Browser kommt, sendet er alle Cookies mit, die mit bank.com
. Wenn sich der Benutzer kürzlich bei bank.com
... die session_id
Cookie gesetzt, und der Server wird denken, dass der Benutzer $1.000.000 auf das Konto 999999 überweisen wollte!
![enter image description here]()
Besuchen Sie einfach keine gefährlichen Seiten, dann wird alles gut.
Das ist nicht genug. Was ist, wenn jemand das Bild auf Facebook postet und es auf Ihrer Pinnwand erscheint? Was ist, wenn es mit einem XSS-Angriff in eine Website eingefügt wird, die Sie besuchen?
Es ist nicht so schlimm. Nur GET-Anfragen sind anfällig.
Das stimmt nicht. Ein Formular, das eine POST-Anfrage sendet, kann dynamisch erstellt werden. Hier ist das Beispiel aus dem Rails-Leitfaden zur Sicherheit :
<a href="http://www.harmless.com/" onclick="
var f = document.createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'POST';
f.action = 'http://www.example.com/account/destroy';
f.submit();
return false;">To the harmless survey</a>
Echtheitstoken
Wenn Ihr ApplicationController
hat dies:
protect_from_forgery with: :exception
Dies:
<%= form_tag do %>
Form contents
<% end %>
wird hierin zusammengefasst:
<form accept-charset="UTF-8" action="/" method="post">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
Form contents
</form>
Insbesondere wird das Folgende erzeugt:
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
Um sich vor CSRF-Angriffen zu schützen, betrachtet Rails die Anfrage als nicht sicher, wenn es das Authentizitäts-Token nicht sieht, das zusammen mit der Anfrage gesendet wird.
Woher soll ein Angreifer wissen, was dieses Token ist? Jedes Mal, wenn das Formular generiert wird, wird ein anderer Wert nach dem Zufallsprinzip erzeugt:
![enter image description here]()
Ein Cross-Site-Scripting (XSS)-Angriff - das ist die Lösung. Aber das ist eine andere Schwachstelle für einen anderen Tag.