> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# CSRF-Schutz

> Erläutert die Funktionsweise von CSRF-Angriffen sowie die Verteidigung durch Origin- und Token-Prüfung in Laravel 13.

## Einführung

CSRF (Cross-Site Request Forgery) ist ein Angriff, bei dem sich der Angreifer als eingeloggter Benutzer ausgibt und diesen ungewollte Anfragen absenden lässt.

Angenommen, Ihre Anwendung stellt `POST /user/email` bereit und akzeptiert damit E-Mail-Adressänderungen. Wenn ein Angreifer auf einer anderen Website ein Formular platziert, das diese URL automatisch aufruft, könnte die E-Mail-Adresse eines Nutzers geändert werden, ohne dass er es bemerkt.

In Laravel 13 ist der CSRF-Schutz durch die in der Middleware-Gruppe `web` enthaltenen Mechanismen standardmäßig aktiv.

## Verhinderung von CSRF-Angriffen

Die Middleware `PreventRequestForgery` von Laravel schützt in zwei Schichten vor CSRF:

1. **Origin-Prüfung** (Header `Sec-Fetch-Site`)
2. **Token-Prüfung** (CSRF-Token pro Session)

Zuerst wird der Origin geprüft; wenn keine Entscheidung möglich ist oder die Prüfung fehlschlägt, wird auf die Token-Prüfung zurückgegriffen.

## Origin-Prüfung

Laravel prüft zunächst `Sec-Fetch-Site` und stellt fest, ob die Anfrage vom selben Origin stammt. Das ist besonders in HTTPS-Umgebungen wirksam.

Besteht die Anfrage die Origin-Prüfung, wird sie direkt zugelassen. Andernfalls wird wie bisher die CSRF-Token-Prüfung ausgeführt.

<Warning>
  `Sec-Fetch-Site` setzt eine HTTPS-Verbindung voraus. In HTTP-Umgebungen funktioniert die Origin-Prüfung nicht, sodass die Token-Prüfung den Hauptschutz bildet.
</Warning>

### Origin-only-Modus

Sie können das Fallback auf die Token-Prüfung deaktivieren und die Entscheidung nur anhand der Origin-Prüfung treffen.

```php theme={null}
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware): void {
        $middleware->preventRequestForgery(originOnly: true);
    });
```

Im Origin-only-Modus liefern Anfragen, die die Origin-Prüfung nicht bestehen, statt `419` den Statuscode `403`.

Möchten Sie Same-Site-Anfragen zulassen (z. B. zwischen Subdomains), setzen Sie `allowSameSite`.

```php theme={null}
$middleware->preventRequestForgery(allowSameSite: true);
```

## Token-Prüfung

Laravel erzeugt pro Session ein CSRF-Token. Sie erhalten es über `csrf_token()` oder aus der Session.

```php theme={null}
use Illuminate\Http\Request;

Route::get('/token', function (Request $request) {
    $tokenFromSession = $request->session()->token();
    $tokenFromHelper = csrf_token();
});
```

Wenn Sie unter `web`-Routen Formulare mit `POST`, `PUT`, `PATCH` oder `DELETE` erstellen, binden Sie stets `@csrf` ein.

```blade theme={null}
<form method="POST" action="/profile">
    @csrf

    <!-- Entspricht dem folgenden hidden Input -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
```

## URIs ausschließen

Bei Anfragen von externen Diensten, etwa Webhooks von Stripe, ist es manchmal nötig, bestimmte URIs vom CSRF-Schutz auszunehmen.

```php theme={null}
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware): void {
        $middleware->preventRequestForgery(except: [
            'stripe/*',
            'http://example.com/foo/bar',
            'http://example.com/foo/*',
        ]);
    });
```

<Info>
  Wenn möglich, legen Sie Webhook-Routen außerhalb der Middleware-Gruppe `web` ab und halten Sie die Ausschlussliste minimal.
</Info>

## X-CSRF-TOKEN-Header

Laravel prüft nicht nur das Feld `_token` aus dem Formular, sondern auch den Header `X-CSRF-TOKEN`.

Geben Sie das Token zunächst in einem Meta-Tag aus.

```blade theme={null}
<meta name="csrf-token" content="{{ csrf_token() }}">
```

Fügen Sie dessen Wert dem Header Ihrer AJAX-Requests hinzu.

```js theme={null}
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': document
            .querySelector('meta[name="csrf-token"]')
            .getAttribute('content'),
    },
});
```

## X-XSRF-TOKEN-Header

Laravel setzt zusätzlich ein verschlüsseltes `XSRF-TOKEN`-Cookie. Axios und Angular übernehmen diesen Wert bei Same-Origin-Anfragen automatisch in den Header `X-XSRF-TOKEN`.

Dadurch greift der CSRF-Schutz in SPA- oder AJAX-Implementierungen häufig, ohne dass Sie den Header manuell setzen müssen.

## Überlegungen bei SPAs

Wenn Sie Laravel als API-Backend für eine SPA einsetzen, holen Sie zuerst das CSRF-Cookie und senden anschließend die Login-Anfrage.

```js theme={null}
await axios.get('/sanctum/csrf-cookie');
await axios.post('/login', {
    email: 'user@example.com',
    password: 'password',
});
```

Weitere Details finden Sie unter [Sanctum](/de/sanctum).


## Related topics

- [Blade-Templates](/de/blade.md)
- [Laravel Fetch Metadata](/de/packages/laravel-fetch-metadata.md)
- [Laravel-Updates März 2026](/de/blog/changelog/202603.md)
- [Middleware](/de/middleware.md)
- [HTTP-Client](/de/http-client.md)
