Vai al contenuto principale

Panoramica

revolution/laravel-fetch-metadata è un pacchetto middleware di sicurezza che verifica le header HTTP Sec-Fetch-* inviate dal browser. Puoi controllare quali richieste ammettere in base a origine, modalità, destinazione e presenza di interazione utente. Sfruttando le funzionalità di sicurezza integrate nel browser puoi bloccare richieste malevole da origini non autorizzate senza compromettere l’esperienza degli utenti legittimi.
In Laravel 13 la verifica dell’Origin nella protezione CSRF utilizza la header Sec-Fetch-Site. Per i dettagli consulta Protezione CSRF.
Per le specifiche dettagliate di Fetch Metadata consulta la documentazione MDN.

Installazione

composer require revolution/laravel-fetch-metadata

Registrazione degli alias di middleware

Registra gli alias dei middleware in 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,
    ]);
})
Puoi usare anche solo alcuni middleware. Puoi rinominare gli alias a piacere.

Descrizione dei middleware

SecFetchSite

La header Sec-Fetch-Site indica la relazione tra l’origine della richiesta e quella del target. Per impostazione predefinita ammette solo same-origin e none (accesso diretto).
ValoreDescrizione
same-originRichiesta dalla stessa origine
same-siteRichiesta dallo stesso sito (es. da sottodomini)
cross-siteRichiesta da un sito diverso
noneRichieste che nascono dalla navigazione, ad esempio quando l’utente digita l’URL
Per i dettagli consulta la documentazione MDN.

SecFetchMode

La header Sec-Fetch-Mode indica la modalità della richiesta. Per impostazione predefinita ammette navigate e cors.
ValoreDescrizione
navigateRichieste di navigazione, es. click su link o invio di form
corsRichiesta CORS
no-corsRichiesta no-cors
same-originRichiesta same-origin
websocketRichiesta di connessione WebSocket
Per i dettagli consulta la documentazione MDN.

SecFetchDest

La header Sec-Fetch-Dest indica il tipo di risorsa destinazione della richiesta. Per i dettagli consulta la documentazione MDN.

SecFetchUser

La header Sec-Fetch-User indica se la richiesta è stata avviata da un’azione dell’utente. Il valore è solo ?1 (interazione utente presente).
Se usi il middleware SecFetchUser blocchi anche i crawler dei motori di ricerca e gli agenti AI. Non usarlo su pagine pubbliche che devono essere indicizzate.

Esempi di utilizzo nelle rotte

Uso base

use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;

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

Specifica dei valori consentiti tramite parametro

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

Specifica di più parametri

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

Senza usare gli alias

use Revolution\FetchMetadata\Middleware\SecFetchSite;

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

Combinare più middleware

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

Gestione degli errori

Se il valore di una header Sec-Fetch-* non è valido, viene lanciata Symfony\Component\HttpKernel\Exception\BadRequestHttpException. Puoi personalizzare la risposta in 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);
        }
    });
})

Relazione con la protezione CSRF

In Laravel 13 il middleware PreventRequestForgery esegue la verifica dell’Origin tramite la header Sec-Fetch-Site come primo passo della protezione CSRF. Questo pacchetto sfrutta le header Fetch Metadata a una granularità ancora maggiore, rafforzando la sicurezza dell’applicazione. Per i dettagli consulta Protezione CSRF.
Per le informazioni più aggiornate consulta la repository su GitHub.
Ultima modifica il 13 luglio 2026