> ## 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-bescherming

> Uitleg over hoe CSRF-aanvallen werken en hoe je je ertegen beschermt met Origin-verificatie en tokenverificatie in Laravel 13.

## Introductie

CSRF (Cross-Site Request Forgery) is een aanval waarbij een ingelogde gebruiker onbedoeld requests verstuurt terwijl de aanvaller zich als die gebruiker voordoet.

Stel bijvoorbeeld dat je app een `POST /user/email`-endpoint heeft waarmee het e-mailadres gewijzigd kan worden. Als een aanvaller op een andere site een formulier plaatst dat automatisch naar deze URL verstuurt, kan het e-mailadres van de gebruiker gewijzigd worden zonder dat die het merkt.

In Laravel 13 is CSRF-bescherming standaard ingeschakeld dankzij het mechanisme dat in de `web`-middlewaregroep zit.

## CSRF-aanvallen voorkomen

De `PreventRequestForgery`-middleware van Laravel voorkomt CSRF met de volgende twee lagen:

1. **Origin-verificatie** (de `Sec-Fetch-Site`-header)
2. **Tokenverificatie** (een CSRF-token per sessie)

Eerst wordt de Origin gecontroleerd; als die niet te bepalen is of de controle mislukt, valt Laravel terug op tokenverificatie.

## Origin-verificatie

Laravel controleert eerst `Sec-Fetch-Site` om te bepalen of het request van dezelfde Origin komt. Dit is vooral effectief in HTTPS-omgevingen.

Als de Origin-verificatie slaagt, wordt het request op dat moment toegestaan. Slaagt die niet, dan wordt zoals voorheen de CSRF-tokenverificatie uitgevoerd.

<Warning>
  `Sec-Fetch-Site` gaat uit van gebruik over HTTPS-verbindingen. In een HTTP-omgeving werkt Origin-verificatie niet en is tokenverificatie de belangrijkste verdediging.
</Warning>

### Origin-only-modus

Je kunt de terugval op tokenverificatie ook uitschakelen en alleen op basis van Origin-verificatie beslissen.

```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);
    });
```

In origin-only-modus geven requests waarvoor de Origin-verificatie mislukt een `403` terug in plaats van een `419`.

Als je same-site wilt toestaan, bijvoorbeeld voor requests tussen subdomeinen, stel je `allowSameSite` in.

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

## Tokenverificatie

Laravel genereert per sessie een CSRF-token. Je kunt dit ophalen met `csrf_token()` of uit de sessie.

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

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

Wanneer je in `web`-routes formulieren maakt met `POST`, `PUT`, `PATCH` of `DELETE`, moet je altijd `@csrf` opnemen.

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

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

## URI's uitsluiten

Voor requests die van externe services komen, zoals webhooks van Stripe, kun je specifieke URI's uitsluiten van CSRF-bescherming.

```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>
  Plaats webhook-routes indien mogelijk buiten de `web`-middlewaregroep en houd het aantal uitsluitingen minimaal.
</Info>

## De X-CSRF-TOKEN-header

Laravel verifieert niet alleen het `_token` in formulieren, maar ook de `X-CSRF-TOKEN`-header.

Zet het token eerst in een meta-tag:

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

Voeg die waarde daarna toe aan de header van AJAX-requests:

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

## De X-XSRF-TOKEN-header

Laravel verstuurt ook een versleutelde `XSRF-TOKEN`-cookie. Axios en Angular kunnen deze waarde bij requests naar dezelfde Origin automatisch in de `X-XSRF-TOKEN`-header zetten.

Daardoor is CSRF-bescherming in SPA- en AJAX-implementaties vaak actief zonder dat je de header handmatig hoeft in te stellen.

## Aandachtspunten voor SPA's

Als je Laravel als API-backend voor een SPA gebruikt, haal je eerst de CSRF-cookie op en verstuur je daarna het loginrequest.

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

Zie [Sanctum](/nl/sanctum) voor meer details.


## Related topics

- [Laravel Fetch Metadata](/nl/packages/laravel-fetch-metadata.md)
- [Laravel-updates van maart 2026](/nl/blog/changelog/202603.md)
- [Upgradegids van Laravel 12 naar 13](/nl/blog/upgrade-12-to-13.md)
- [Laravel Sanctum (API-tokenauthenticatie)](/nl/sanctum.md)
- [Middleware](/nl/middleware.md)
