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

> Middleware de sécurité utilisant les en-têtes Sec-Fetch-* pour protéger les applications Laravel contre les attaques CSRF et les requêtes cross-site.

## Vue d'ensemble

[revolution/laravel-fetch-metadata](https://github.com/invokable/laravel-fetch-metadata) est un package de middleware de sécurité qui valide les en-têtes HTTP `Sec-Fetch-*` envoyés par le navigateur. Vous pouvez contrôler les requêtes autorisées en fonction de leur origine, mode, destination et de la présence ou non d'une interaction utilisateur.

En tirant parti des fonctionnalités de sécurité intégrées au navigateur, vous pouvez bloquer les requêtes malveillantes provenant d'origines non autorisées sans nuire à l'expérience des utilisateurs légitimes.

<Info>
  Dans Laravel 13, l'en-tête `Sec-Fetch-Site` est désormais utilisé pour la vérification d'Origin dans la protection CSRF. Pour plus de détails, consultez la [protection CSRF](/fr/csrf).
</Info>

Pour la spécification détaillée de Fetch Metadata, consultez la [documentation MDN](https://developer.mozilla.org/fr/docs/Glossary/Fetch_metadata_request_header).

## Installation

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

### Enregistrement des alias de middleware

Enregistrez les alias de middleware dans `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,
    ]);
})
```

Vous pouvez n'utiliser qu'une partie des middlewares. Les noms d'alias sont librement modifiables.

## Description des middlewares

### SecFetchSite

L'en-tête `Sec-Fetch-Site` indique la relation entre l'origine de la requête et l'origine cible. Par défaut, seules `same-origin` et `none` (accès direct) sont autorisées.

| Valeur        | Description                                                                       |
| ------------- | --------------------------------------------------------------------------------- |
| `same-origin` | Requête depuis la même origine                                                    |
| `same-site`   | Requête depuis le même site (sous-domaines, etc.)                                 |
| `cross-site`  | Requête depuis un site différent                                                  |
| `none`        | Requête d'origine navigation, comme la saisie directe d'une URL par l'utilisateur |

Pour plus de détails, consultez la [documentation MDN](https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Sec-Fetch-Site).

### SecFetchMode

L'en-tête `Sec-Fetch-Mode` indique le mode de la requête. Par défaut, `navigate` et `cors` sont autorisés.

| Valeur        | Description                                                               |
| ------------- | ------------------------------------------------------------------------- |
| `navigate`    | Requête de navigation comme un clic sur un lien ou un envoi de formulaire |
| `cors`        | Requête CORS                                                              |
| `no-cors`     | Requête no-cors                                                           |
| `same-origin` | Requête same-origin                                                       |
| `websocket`   | Requête de connexion WebSocket                                            |

Pour plus de détails, consultez la [documentation MDN](https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Sec-Fetch-Mode).

### SecFetchDest

L'en-tête `Sec-Fetch-Dest` indique le type de ressource cible de la requête.

Pour plus de détails, consultez la [documentation MDN](https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Sec-Fetch-Dest).

### SecFetchUser

L'en-tête `Sec-Fetch-User` indique si la requête a été initiée par une interaction utilisateur. La seule valeur possible est `?1` (interaction utilisateur présente).

<Warning>
  L'utilisation du middleware `SecFetchUser` bloque également les crawlers de moteurs de recherche et les agents IA. Ne l'utilisez pas sur des pages publiques qui doivent être indexées.
</Warning>

## Exemples d'utilisation dans le routage

### Utilisation de base

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

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

### Spécifier les valeurs autorisées via un paramètre

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

### Spécifier plusieurs paramètres

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

### Sans utiliser d'alias

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

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

### Combiner plusieurs middlewares

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

## Gestion des erreurs

Lorsque la valeur d'un en-tête `Sec-Fetch-*` est incorrecte, une exception `Symfony\Component\HttpKernel\Exception\BadRequestHttpException` est levée.

Vous pouvez personnaliser la réponse dans `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);
        }
    });
})
```

## Relation avec la protection CSRF

Dans Laravel 13, le middleware `PreventRequestForgery` effectue désormais la vérification d'Origin via l'en-tête `Sec-Fetch-Site` comme première étape de la protection CSRF. Ce package permet d'aller plus loin en exploitant les en-têtes Fetch Metadata avec une granularité plus fine pour renforcer la sécurité de votre application.

Pour plus de détails, consultez la [protection CSRF](/fr/csrf).

<Info>
  Pour les informations à jour, consultez le [dépôt GitHub](https://github.com/invokable/laravel-fetch-metadata).
</Info>


## Related topics

- [Socialite - Laravel Bluesky](/fr/packages/laravel-bluesky/socialite.md)
- [Guide de mise à niveau de Laravel 12 vers 13](/fr/blog/upgrade-12-to-13.md)
- [Contexte de session et filtrage](/fr/packages/laravel-copilot-sdk/session-context.md)
- [Protection CSRF](/fr/csrf.md)
- [Laravel AI SDK](/fr/ai-sdk.md)
