Passer au contenu principal

Vue d’ensemble

revolution/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.
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.
Pour la spécification détaillée de Fetch Metadata, consultez la documentation MDN.

Installation

composer require revolution/laravel-fetch-metadata

Enregistrement des alias de middleware

Enregistrez les alias de middleware dans bootstrap/app.php.
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.
ValeurDescription
same-originRequête depuis la même origine
same-siteRequête depuis le même site (sous-domaines, etc.)
cross-siteRequête depuis un site différent
noneRequête d’origine navigation, comme la saisie directe d’une URL par l’utilisateur
Pour plus de détails, consultez la documentation MDN.

SecFetchMode

L’en-tête Sec-Fetch-Mode indique le mode de la requête. Par défaut, navigate et cors sont autorisés.
ValeurDescription
navigateRequête de navigation comme un clic sur un lien ou un envoi de formulaire
corsRequête CORS
no-corsRequête no-cors
same-originRequête same-origin
websocketRequête de connexion WebSocket
Pour plus de détails, consultez la documentation MDN.

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.

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).
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.

Exemples d’utilisation dans le routage

Utilisation de base

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

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

Spécifier plusieurs paramètres

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

Sans utiliser d’alias

use Revolution\FetchMetadata\Middleware\SecFetchSite;

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

Combiner plusieurs middlewares

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.
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.
Pour les informations à jour, consultez le dépôt GitHub.
Dernière modification le 13 juillet 2026