info@a-coding-project.de

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',
    ];
}

Laravel Entwickler gesucht?

Wir haben bereits viel Erfahrung im Umgang mit Laravel und Vue.js.
Nehmen Sie gerne unverbindlich Kontakt zu uns auf.

zum Angebot

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant