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

# Laravel Fetch Metadata

> Beveiligingsmiddleware op basis van Sec-Fetch-*-headers die je Laravel-app beschermt tegen CSRF-aanvallen en cross-site requests.

## Overzicht

[revolution/laravel-fetch-metadata](https://github.com/invokable/laravel-fetch-metadata) is een pakket met beveiligingsmiddleware die de `Sec-Fetch-*` HTTP-headers valideert die browsers versturen. Je kunt bepalen welke requests worden toegestaan op basis van de herkomst, modus, bestemming en of er een gebruikersactie aan ten grondslag ligt.

Door gebruik te maken van beveiligingsfuncties die in de browser zijn ingebouwd, kun je kwaadaardige requests van ongeautoriseerde origins blokkeren zonder de ervaring van legitieme gebruikers te verstoren.

<Info>
  In Laravel 13 wordt de `Sec-Fetch-Site`-header gebruikt voor de Origin-validatie van de CSRF-bescherming. Zie [CSRF-bescherming](/nl/csrf) voor meer details.
</Info>

Zie de [MDN-documentatie](https://developer.mozilla.org/ja/docs/Glossary/Fetch_metadata_request_header) voor de volledige Fetch Metadata-specificatie.

## Installatie

```bash theme={null}
composer require revolution/laravel-fetch-metadata
```

### Middleware-aliassen registreren

Registreer de middleware-aliassen in `bootstrap/app.php`.

```php theme={null}
use Illuminate\Foundation\Configuration\Middleware;
use Revolution\FetchMetadata\Middleware\SecFetchSite;
use Revolution\FetchMetadata\Middleware\SecFetchMode;
use Revolution\FetchMetadata\Middleware\SecFetchDest;
use Revolution\FetchMetadata\Middleware\SecFetchUser;

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'sec-fetch-site' => SecFetchSite::class,
        'sec-fetch-mode' => SecFetchMode::class,
        'sec-fetch-dest' => SecFetchDest::class,
        'sec-fetch-user' => SecFetchUser::class,
    ]);
})
```

Je kunt ook slechts een deel van de middleware gebruiken. De aliasnamen kun je naar wens aanpassen.

## Uitleg van de middleware

### SecFetchSite

De `Sec-Fetch-Site`-header geeft de relatie aan tussen de herkomst van het request en de origin van het doel. Standaard worden alleen `same-origin` en `none` (directe toegang) toegestaan.

| Waarde        | Beschrijving                                                                         |
| ------------- | ------------------------------------------------------------------------------------ |
| `same-origin` | Request vanaf dezelfde origin                                                        |
| `same-site`   | Request vanaf dezelfde site, bijvoorbeeld een subdomein                              |
| `cross-site`  | Request vanaf een andere site                                                        |
| `none`        | Request door navigatie, bijvoorbeeld wanneer de gebruiker de URL rechtstreeks intypt |

Zie de [MDN-documentatie](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Sec-Fetch-Site) voor meer details.

### SecFetchMode

De `Sec-Fetch-Mode`-header geeft de modus van het request aan. Standaard worden `navigate` en `cors` toegestaan.

| Waarde        | Beschrijving                                                                    |
| ------------- | ------------------------------------------------------------------------------- |
| `navigate`    | Navigatierequest, zoals een klik op een link of het versturen van een formulier |
| `cors`        | CORS-request                                                                    |
| `no-cors`     | no-cors-request                                                                 |
| `same-origin` | Same-origin-request                                                             |
| `websocket`   | WebSocket-verbindingsrequest                                                    |

Zie de [MDN-documentatie](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Sec-Fetch-Mode) voor meer details.

### SecFetchDest

De `Sec-Fetch-Dest`-header geeft het resourcetype van de bestemming van het request aan.

Zie de [MDN-documentatie](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Sec-Fetch-Dest) voor meer details.

### SecFetchUser

De `Sec-Fetch-User`-header geeft aan of het request door een gebruikersactie is gestart. De enige waarde is `?1` (gestart door gebruikersactie).

<Warning>
  Als je de `SecFetchUser`-middleware gebruikt, worden ook crawlers van zoekmachines en AI-agents geblokkeerd. Gebruik deze middleware niet op openbare pagina's die geïndexeerd moeten worden.
</Warning>

## Voorbeelden in routing

### Basisgebruik

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

Route::post('user/update-password', function (Request $request) {
    //
})->middleware('sec-fetch-site');
```

### Toegestane waarden opgeven via parameters

```php theme={null}
Route::post('user/update-password', function (Request $request) {
    //
})->middleware('sec-fetch-site:cross-site');
```

### Meerdere parameters opgeven

```php theme={null}
Route::post('user/update-password', function (Request $request) {
    //
})->middleware('sec-fetch-site:same-origin,cross-site');
```

### Zonder alias

```php theme={null}
use Revolution\FetchMetadata\Middleware\SecFetchSite;

Route::post('user/update-password', function (Request $request) {
    //
})->middleware(SecFetchSite::class.':same-origin,cross-site');
```

### Meerdere middleware combineren

```php theme={null}
Route::post('user/update-profile', function (Request $request) {
    //
})->middleware(['sec-fetch-site:same-origin', 'sec-fetch-mode:navigate']);
```

## Foutafhandeling

Als de waarde van een `Sec-Fetch-*`-header ongeldig is, wordt een `Symfony\Component\HttpKernel\Exception\BadRequestHttpException` gegooid.

Je kunt de response aanpassen in `bootstrap/app.php`.

```php theme={null}
use Illuminate\Http\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->render(function (BadRequestHttpException $e, Request $request) {
        if ($request->expectsJson()) {
            return response()->json([
                'message' => $e->getMessage(),
            ], 400);
        }
    });
})
```

## Relatie met CSRF-bescherming

In Laravel 13 voert de `PreventRequestForgery`-middleware als eerste stap van de CSRF-bescherming een Origin-validatie uit op basis van de `Sec-Fetch-Site`-header. Met dit pakket kun je de Fetch Metadata-headers op een fijnmaziger niveau inzetten en de beveiliging van je applicatie verder versterken.

Zie [CSRF-bescherming](/nl/csrf) voor meer details.

<Info>
  Zie de [GitHub-repository](https://github.com/invokable/laravel-fetch-metadata) voor de meest recente informatie.
</Info>


## Related topics

- [Laravel MCP](/nl/mcp.md)
- [Upgradegids van Laravel 12 naar 13](/nl/blog/upgrade-12-to-13.md)
- [Laravel Head](/nl/head.md)
- [Laravel-updates van juni 2026](/nl/blog/changelog/202606.md)
- [Socialite - Laravel Bluesky](/nl/packages/laravel-bluesky/socialite.md)
