Laravel CSRF Protection
Lerne, wofür das CSRF-Token in Laravel ist und wie man es einsetzt. Wir zeigen an Hand von Beispielen den Einsatz in Blade-Formularen und in Vue.js.
Was ist CSRF?
CSRF steht für Cross-Site-Request-Forgery, was bedeutet, dass ein Angreifer im Browser seines Opfers eine Abfrage ausführt, die in einer Webanwendung eine bestimmte Aktion auslöst. Am einfachsten lässt sich das über ein Beispiel erklären.
Stell dir ein Portal im Bereich Online-Banking vor. Dort können die Anwender über ein HTML-Formular eine Überweisung ausführen:
<form method="POST"> <label>IBAN</label> <input name="iban" /> <label>Betrag</label> <input name="betrag" /> € <button>Überweisen</button> </form>
Wenn der Benutzer bei der Bank eingeloggt ist, kann ein Angreifer dieses Formular nun in abgewandelter Form auf seiner eigenen Website einsetzen:
<form method="POST" action="//bank.com/ueberweisen"> <input name="iban" type="hidden" value="DE1234567890" /> <input name="betrag" type="hidden" value="1000000" /> <button>Angriff starten</button> </form>
Hier sind das Opfer nur einen Knopf mit der Aufschrift "Angriff starten". Klickt das Opfer darauf, wird das Formular abgeschickt und der Angreifer wird zum Millionär.
In diesem Fall würde der Angreifer mitbekommen, dass die Seite der Bank aufgerufen wurde. Man könnte das Formular aber auch über JavaScript z.B. in einem IFrame abschicken und das Opfer würde davon nichts bemerken.
Um dieses Verhalten zu Unterbinden kann die Bank ein CSRF-Token einbinden. Das ist im Endeffekt eine Zeichenfolge, die sich bei jedem Aufruf verändert:
<form method="POST"> <input type="hidden" name="csrf" value="hsg90jklgsdyngh8hsipgn" /> <label>IBAN</label> <input name="iban" /> <label>Betrag</label> <input name="betrag" /> € <button>Überweisen</button> </form>
Am Server der Bank wird dann geprüft, ob diese Zeichenkette korrekt ist.
Der Vorteil ist, dass ein Abschicken des Formulars nur möglich ist, wenn die korrekte Zeichenkette angegebn ist. An diese kommt der Angreifer aber nicht ohne Weiteres heran.
CSRF im Laravel-Formular einbinden
Laravel bietet von Haus aus eine solche CSRF-Prüfung für alle POST-Anfragen und Cookies.
Das geschieht in der Middleware VerifyCsrfToken
.
Im Formular lässt sich das CSRF-Token einfach mit dem gleichnahmigen Blade-Befehl einbinden:
<form method="POST"> @csrf <label>IBAN</label> <input name="iban" /> <label>Betrag</label> <input name="betrag" /> € <button>Überweisen</button> </form>
CSRF in Ajax-Abfragen
Eine beliebte Methode, um in Laravel Ajax-Abfragen zu stellen ist Axios. Axios ist standardmäßig
in Laravel integriert und so konfiguriert, dass das CSRF-Token bei Ajax-Abfragen direkt mitgeschickt wird.
Dazu muss lediglich folgender Meta-Tag in dem <head>
der Seite integriert werden:
<meta name="csrf-token" content="{{ csrf_token() }}">
Wer eine Ajax-Abfrage ohne Axios macht, muss das Token im HTTP-Header mit dem Namen X-CSRF-TOKEN
mitschicken.
Dazu kann man sich das Token dann ebenfalls aus dem Meta-Tag nehmen.
CSRF deaktivieren
Generell sollte man aus sicherheitsgründen mit dem CSRF-Token arbeiten.
In Laravel ist das auch ohne große Umstände möglich.
Es kann allerdings sein, dass es gewünscht ist, ein Formular auch auf einer fremden Website zu hinterlegen,
die ein solches Token nicht hat. In dem Fall lassen sich Urls in der VerifyCsrfToken
-Middleware als Ausnahme hinzufügen:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ '/ueberweisen', ]; }
Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.
Über uns
Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project