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?
Huh? Wer ist dieser Typ, der versucht, eine Übertragung zu initiieren? Es ist nicht der Besitzer des Kontos, das ist sicher.
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 das session_id
Cookie sendet , weiß der Server:
Oh, das ist John Doe. Er hat sich vor 2,5 Minuten erfolgreich angemeldet. Er ist gut zu gehen.
Ein Hacker könnte denken:
Hmm. Eine normale HTTP-Anfrage funktioniert nicht, aber wenn ich diesen session_id
Cookie in die Hand bekommen könnte , wäre ich golden.
Der Browser des Benutzers hat eine Reihe von Cookies für die bank.com
Domain gesetzt. Jedes Mal, wenn der Benutzer eine Anfrage an die bank.com
Domain stellt, werden alle Cookies mitgesendet. Einschließlich des session_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:
<img src="http://bank.com/transfer?amount=$1000000&account-to=999999">
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 bei bank.com
... angemeldet hat, wird das session_id
Cookie gesetzt und der Server wird denken, dass der Benutzer 1.000.000 USD auf das Konto 999999 überweisen wollte!
Besuchen Sie nur keine gefährlichen Orte und es wird Ihnen gut gehen.
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?
Es ist nicht so schlecht. Nur GET-Anforderungen sind anfällig.
Nicht wahr. Ein Formular, das eine POST-Anforderung sendet, kann dynamisch generiert werden. Hier ist das Beispiel aus dem Rails-Handbuch 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>
Authentizitätstoken
Wenn Sie ApplicationController
dies haben:
protect_from_forgery with: :exception
Diese:
<%= form_tag do %>
Form contents
<% end %>
Ist in diesem kompiliert:
<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 folgendes erzeugt:
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
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.