Zum Hauptinhalt springen

Überblick

revolution/laravel-fetch-metadata ist ein Middleware-Paket, das die vom Browser gesendeten Sec-Fetch-*-HTTP-Header überprüft. Sie können damit anhand von Ursprung, Modus, Ziel und ob die Anfrage durch eine Nutzeraktion ausgelöst wurde, steuern, welche Requests zugelassen werden. Indem Sie die im Browser eingebauten Sicherheitsfunktionen nutzen, verhindern Sie bösartige Requests von unerlaubten Ursprüngen, ohne die Nutzererfahrung legitimer Anwender zu beeinträchtigen.
In Laravel 13 wird für die Origin-Prüfung des CSRF-Schutzes nun der Header Sec-Fetch-Site verwendet. Details siehe CSRF-Schutz.
Ausführliche Informationen zur Spezifikation von Fetch Metadata finden Sie in der MDN-Dokumentation.

Installation

composer require revolution/laravel-fetch-metadata

Middleware-Alias registrieren

Registrieren Sie in bootstrap/app.php die Aliase der Middleware.
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,
    ]);
})
Sie können auch nur einige Middlewares verwenden. Die Alias-Namen können Sie beliebig anpassen.

Erläuterung der Middlewares

SecFetchSite

Der Header Sec-Fetch-Site gibt die Beziehung zwischen Herkunft der Anfrage und Ziel-Origin an. Standardmäßig werden nur same-origin und none (direkter Zugriff) erlaubt.
WertBeschreibung
same-originRequest vom selben Origin
same-siteRequest von derselben Site (z. B. Subdomains)
cross-siteRequest von einer anderen Site
noneNavigationsbezogene Requests, z. B. wenn der Nutzer die URL direkt eingibt
Details siehe MDN-Dokumentation.

SecFetchMode

Der Header Sec-Fetch-Mode gibt den Modus der Anfrage an. Standardmäßig werden navigate und cors erlaubt.
WertBeschreibung
navigateNavigations-Requests, z. B. Klick auf Links oder Formularabsenden
corsCORS-Request
no-corsno-cors-Request
same-originSame-origin-Request
websocketAnfrage zur WebSocket-Verbindung
Details siehe MDN-Dokumentation.

SecFetchDest

Der Header Sec-Fetch-Dest gibt den Ressourcentyp des Anfrageziels an. Details siehe MDN-Dokumentation.

SecFetchUser

Der Header Sec-Fetch-User gibt an, ob die Anfrage durch eine Nutzeraktion ausgelöst wurde. Der einzige Wert ist ?1 (Nutzeraktion vorhanden).
Wenn Sie die SecFetchUser-Middleware einsetzen, werden auch Suchmaschinen-Crawler und AI-Agents blockiert. Setzen Sie sie nicht auf öffentlichen Seiten ein, die indexiert werden sollen.

Anwendungsbeispiele im Routing

Grundlegende Verwendung

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

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

Erlaubte Werte per Parameter festlegen

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

Mehrere Parameter angeben

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

Ohne Alias

use Revolution\FetchMetadata\Middleware\SecFetchSite;

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

Mehrere Middlewares kombinieren

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

Fehlerbehandlung

Wenn der Wert eines Sec-Fetch-*-Headers ungültig ist, wird eine Symfony\Component\HttpKernel\Exception\BadRequestHttpException geworfen. In bootstrap/app.php können Sie die Antwort anpassen.
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);
        }
    });
})

Zusammenhang mit dem CSRF-Schutz

In Laravel 13 nimmt die Middleware PreventRequestForgery als ersten Schritt des CSRF-Schutzes eine Origin-Prüfung mit dem Header Sec-Fetch-Site vor. Dieses Paket nutzt Fetch-Metadata-Header darüber hinaus feingranular und stärkt die Sicherheit Ihrer Anwendung. Details siehe CSRF-Schutz.
Aktuelle Informationen finden Sie im GitHub-Repository.
Zuletzt geändert am 13. Juli 2026