Security-Header-Architektur für Laravel

Alle Security Headers in einer zentralen Middleware konfigurieren — von der Erstellung über die Registrierung bis zur optimalen Header-Reihenfolge.

Laravel · Schritt für Schritt

Konsolidierte Security Headers in Laravel

Laravels Middleware-Architektur ist ideal für Security Headers: Eine einzige Middleware-Klasse setzt alle Header zentral, testbar und versionierbar. Statt Header über verschiedene Konfigurationsdateien zu verteilen, bündelt SecurityHeaders.php alles an einem Ort.

Diese Anleitung zeigt die vollständige Implementierung: von der Middleware-Erstellung über die korrekte Registrierung in Laravel 10 und 11 bis zur optimalen Header-Reihenfolge. Der Code ist direkt in Ihr Projekt kopierbar.

1 Schritt 1 von 4

SecurityHeaders-Middleware erstellen

Erstellen Sie eine neue Middleware mit php artisan make:middleware SecurityHeaders. Diese Middleware fängt jeden Response ab und fügt alle Security Headers hinzu. Der Nonce wird vor dem Response generiert und über app()->instance() für Blade-Templates verfügbar gemacht.

app/Http/Middleware/SecurityHeaders.php Konsolidiert
<?php
// app/Http/Middleware/SecurityHeaders.php
// Konsolidierte Security-Header-Middleware
// Generiert aus Wolf-Agents Web Security Guide

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class SecurityHeaders
{
    public function handle(Request $request, Closure $next): Response
    {
        // Nonce für CSP generieren
        $nonce = base64_encode(random_bytes(16));
        app()->instance('csp-nonce', $nonce);

        $response = $next($request);

        // --- Content Security Policy ---
        $csp = implode('; ', [
            "default-src 'self'",
            "script-src 'self' 'nonce-{$nonce}' 'strict-dynamic'",
            "style-src 'self' 'unsafe-inline'",
            "img-src 'self' data: https:",
            "font-src 'self'",
            "connect-src 'self'",
            "object-src 'none'",
            "frame-ancestors 'self'",
            "base-uri 'self'",
            "form-action 'self'",
            "upgrade-insecure-requests",
        ]);
        $response->headers->set('Content-Security-Policy', $csp);

        // --- HSTS ---
        $response->headers->set('Strict-Transport-Security',
            'max-age=31536000; includeSubDomains; preload');

        // --- Weitere Header ---
        $response->headers->set('X-Content-Type-Options', 'nosniff');
        $response->headers->set('X-Frame-Options', 'SAMEORIGIN');
        $response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');
        $response->headers->set('Permissions-Policy',
            'camera=(), microphone=(), geolocation=(), payment=()');
        $response->headers->set('Cross-Origin-Opener-Policy', 'same-origin');
        $response->headers->set('Cross-Origin-Resource-Policy', 'same-origin');
        $response->headers->set('Origin-Agent-Cluster', '?1');

        return $response;
    }
}
Warum eine konsolidierte Middleware?

Mehrere Middleware-Klassen für verschiedene Header erzeugen unnötigen Overhead. Eine einzige Middleware reduziert die Angriffsfläche (ein Ort zum Auditen), vereinfacht das Deployment und vermeidet Reihenfolge-Konflikte zwischen Middlewares.

2 Schritt 2 von 4

Middleware registrieren

Die Registrierung unterscheidet sich zwischen Laravel 10 und 11. In Laravel 11 erfolgt sie in bootstrap/app.php, in Laravel 10 im Kernel.php. Registrieren Sie die Middleware in der web-Middleware-Gruppe, damit sie nur auf Browser-Requests angewendet wird.

Laravel 11+ Empfohlen
// bootstrap/app.php (Laravel 11+)
return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->append(
            \App\Http\Middleware\SecurityHeaders::class
        );
    })
    ->create();
Laravel 10 Alternativ
// app/Http/Kernel.php (Laravel 10)
protected $middlewareGroups = [
    'web' => [
        // ... bestehende Middleware
        \App\Http\Middleware\SecurityHeaders::class,
    ],
];
Für API-Routen erstellen Sie eine separate ApiSecurityHeaders-Middleware mit Cache-Control: no-store und CORS-Headern, aber ohne CSP und Session-Cookies.
3 Schritt 3 von 4

Empfohlene Header-Reihenfolge

Die Reihenfolge der Header im Code beeinflusst nicht die Browser-Verarbeitung, aber eine konsistente Struktur erleichtert Audits und Wartung. Wir empfehlen diese Reihenfolge nach Sicherheitsrelevanz.

1
Content-Security-Policy 35 Pkt
Wichtigster Header — XSS-Schutz mit Nonces
2
Strict-Transport-Security 15 Pkt
HTTPS erzwingen, SSL-Stripping verhindern
3
Permissions-Policy 10 Pkt
Browser-APIs einschränken
4
X-Frame-Options + Referrer-Policy + X-Content-Type-Options 30 Pkt
Basis-Header — je eine Zeile
5
Cross-Origin Headers + Origin-Agent-Cluster 30+ Pkt
Isolation und erweiterte Sicherheit
4 Schritt 4 von 4

Konfiguration verifizieren

Nach der Registrierung prüfen Sie die Header mit curl, den Browser DevTools und dem Wolf-Agents Web Security Check. Stellen Sie sicher, dass alle Header korrekt gesetzt sind.

Terminal Verifizieren
# Config-Cache leeren (wichtig nach .env-Änderungen)
php artisan config:cache

# Lokalen Server starten
php artisan serve

# Header prüfen
curl -sI http://localhost:8000 | grep -iE "content-security|strict-transport|x-frame|referrer|x-content-type"

Checkliste nach Deployment

Browser DevTools

Öffnen Sie F12 und prüfen Sie im Network-Tab die Response Headers. Alle Security Header müssen auf jeder Seite sichtbar sein.

Wolf-Agents Check

Der Web Security Check prüft 166 Punkte und zeigt fehlende oder fehlerhafte Header sofort an.

PHPUnit-Test

Schreiben Sie einen Feature-Test, der prüft, ob alle erwarteten Header in der Response vorhanden sind. So fällt eine versehentliche Entfernung sofort auf.

Wenn Sie einen Reverse Proxy (z.B. Nginx) vor Laravel betreiben, prüfen Sie, ob der Proxy Header überschreibt. Laravel-Header können durch Proxy-Konfigurationen verloren gehen.

Compliance-Anforderungen

Eine konsolidierte Middleware-Architektur unterstützt direkt die Anforderungen mehrerer Compliance-Frameworks. Die zentrale Verwaltung aller Security Headers in einer Datei vereinfacht Audits erheblich.

PCI DSS 4.0 — Requirement 6.4.3 verlangt dokumentierte Security-Header-Konfigurationen. Eine Middleware-Datei im Git ist die Dokumentation.
NIS2 — Artikel 21 fordert technische Maßnahmen zur Cyber-Sicherheit. Security Headers sind eine Basismaßnahme.
OWASP ASVS — Level 1 (V14.4) fordert Security Headers. Die Middleware deckt alle relevanten Header ab.

Wie steht Ihre Domain bei Implementierungs-Architektur?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.