Erweiterte Header für Shopware 6

Origin-Agent-Cluster, Fetch Metadata und X-DNS-Prefetch-Control per EventSubscriber — die letzten Prozente für eine perfekte Web Security Note.

Shopware · Schritt für Schritt

Erweiterte Header in Shopware 6

Erweiterte Security Headers umfassen Origin-Agent-Cluster, X-DNS-Prefetch-Control, X-Permitted-Cross-Domain-Policies und X-Download-Options. Zusammen machen sie 4 von 166 Punkten im Wolf-Agents Web Security Check aus. Einzeln haben sie geringen Einfluss — zusammen machen sie den Unterschied zwischen Note A und A+.

In Shopware 6 gibt es keine native Konfigurationsoption für diese Header — weder in der shopware.yaml noch in der Administration. Die Implementierung erfolgt über einen EventSubscriber, der auf das kernel.response-Event reagiert. Jeder Header ist eine einzelne Zeile im Subscriber und hat keinerlei negative Auswirkungen auf die Shop-Funktionalität. Das macht diese Header zu den risikoärmsten Optimierungen.

Für Shopware Cloud-Installationen ist der EventSubscriber der einzige Weg, da keine Server-Level-Konfiguration möglich ist. Bei Self-Hosted können Sie alternativ Nginx verwenden — aber Achtung: Wenn sowohl Nginx als auch der EventSubscriber Header setzen, entstehen Duplikate. Entscheiden Sie sich für einen Ansatz. Der Wolf-Agents Web Security Scanner prüft automatisch, ob alle erweiterten Header gesetzt sind.

Implementierung

Variante A (empfohlen): Vollständiger EventSubscriber mit allen erweiterten Headern. Variante B: Nginx für Self-Hosted. Variante C: Service-Registrierung in der services.xml.

Variante A — EventSubscriber
SecurityHeaderSubscriber.phpEmpfohlen
// src/Subscriber/SecurityHeaderSubscriber.php
namespace App\Subscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class SecurityHeaderSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::RESPONSE => ['onResponse', -10],
        ];
    }

    public function onResponse(ResponseEvent $event): void
    {
        $response = $event->getResponse();

        // Origin-Agent-Cluster — Prozess-Isolierung (Spectre-Schutz)
        $response->headers->set('Origin-Agent-Cluster', '?1');

        // X-DNS-Prefetch-Control — DNS-Prefetching steuern
        $response->headers->set('X-DNS-Prefetch-Control', 'off');

        // X-Permitted-Cross-Domain-Policies — Flash/PDF blockieren
        $response->headers->set('X-Permitted-Cross-Domain-Policies', 'none');

        // X-Download-Options — IE Download-Öffnung verhindern
        $response->headers->set('X-Download-Options', 'noopen');
    }
}
Variante B — Nginx
nginx.confServer-Level
# Nginx — Alternative für Self-Hosted
# Alle erweiterten Header auf Server-Ebene

# Prozess-Isolierung (Spectre-Schutz)
add_header Origin-Agent-Cluster "?1" always;

# DNS-Prefetching deaktivieren (Privacy)
add_header X-DNS-Prefetch-Control "off" always;

# Flash/PDF Cross-Domain-Policies blockieren
add_header X-Permitted-Cross-Domain-Policies "none" always;

# IE Download-Öffnung verhindern
add_header X-Download-Options "noopen" always;
Variante C — Service registrieren
services.xmlKonfiguration
<!-- services.xml — Subscriber registrieren -->
<service id="App\Subscriber\SecurityHeaderSubscriber">
    <tag name="kernel.event_subscriber"/>
</service>
Origin-Agent-Cluster und Shopware Cloud

Origin-Agent-Cluster: ?1 fordert den Browser auf, die Seite in einem eigenen Prozess zu isolieren. Das verhindert Spectre-Seitenkanal-Angriffe und kann sogar die Performance verbessern, da der Browser Ressourcen besser isoliert. Der Header ist vollständig risikoarm — er hat keine negativen Auswirkungen auf Payment-iFrames, CDN-Assets oder Plugin-Funktionalität. Für Shopware Cloud ist der EventSubscriber der einzige Weg, da kein Nginx-Zugriff besteht.

Verifizierung

Prüfen Sie nach dem Cache-Leeren alle vier erweiterten Header. Achten Sie besonders darauf, dass kein Header doppelt gesetzt ist (durch Nginx UND EventSubscriber) und dass der HTTP Cache die Header korrekt weitergibt.

TerminalVerifizierung
# 1. Cache leeren
bin/console cache:clear

# 2. Alle erweiterten Header auf einmal prüfen
curl -sI https://ihr-shop.de | grep -iE "origin-agent|x-dns-prefetch|x-permitted|x-download"
# Erwartete Ausgabe:
# origin-agent-cluster: ?1
# x-dns-prefetch-control: off
# x-permitted-cross-domain-policies: none
# x-download-options: noopen

# 3. Prüfen ob Header nicht doppelt gesetzt sind
curl -sI https://ihr-shop.de | grep -ci "origin-agent-cluster"
# Erwartete Ausgabe: 1 (nicht 2 oder mehr)

# 4. Auch auf Produktseite prüfen (HTTP Cache)
curl -sI https://ihr-shop.de/beispiel-produkt | grep -iE "origin-agent|x-dns-prefetch"
Tipp: Kombinieren Sie alle Security-Header in einem einzigen EventSubscriber. Die Trennung in separate Dateien ist unnötig und macht die Wartung schwieriger. Ein SecurityHeaderSubscriber.php für alle Header ist die Best Practice.

Häufige Fehler

Doppelte Header durch Nginx und EventSubscriber

Wenn sowohl Webserver als auch EventSubscriber denselben Header setzen, sendet der Browser ihn doppelt. Manche Scanner werten das als Fehler. Entscheiden Sie sich für einen Weg. Bei Nginx: proxy_hide_header Origin-Agent-Cluster; vor dem add_header entfernt die Shopware-Version.

Plugin-Update überschreibt Header

Shopware-Plugin-Updates können eigene EventSubscriber mitbringen, die Ihre Header-Konfiguration überschreiben. Prüfen Sie nach jedem Plugin-Update mit curl -sI, ob alle erweiterten Header noch gesetzt sind. Setzen Sie eine niedrige Priorität (-10) damit Ihr Subscriber zuletzt ausgeführt wird.

HTTP Cache liefert Header nicht aus

Shopware's HTTP Cache speichert auch Response-Header. Wenn Sie den EventSubscriber nach dem Cache-Aufbau hinzufügen, fehlen die Header auf gecachten Seiten. Lösung: bin/console cache:clear und bin/console http:cache:clear nach jeder Header-Änderung.

Shopware Cloud: Kein Server-Zugriff

Bei Shopware Cloud können Sie keine Nginx-Konfiguration ändern. Alle Header müssen über den EventSubscriber gesetzt werden. Shopware Cloud cached aggressiv — testen Sie nach Deployment, ob die Header auf der Live-Seite angekommen sind.

Compliance-Relevanz

NIS2 Art. 21(e) — Defense in Depth durch mehrere Sicherheitsschichten. Erweiterte Header ergänzen die primären Security Headers und bilden die letzte Verteidigungslinie.
BSI APP.3.1 — Vollständige Security-Header-Konfiguration als Best Practice. Das BSI empfiehlt die Aktivierung aller verfügbaren Browser-Sicherheitsmechanismen.
OWASP ASVS V14.4 — Alle empfohlenen Security Headers implementieren. Origin-Agent-Cluster schützt vor Spectre-Angriffen, X-Permitted-Cross-Domain-Policies verhindert Cross-Domain-Datenexfiltration.
PCI DSS 4.0 Requirement 6.2.4 — Sicherheitsmaßnahmen in der Softwareentwicklung. Erweiterte Header sind ein einfacher aber effektiver Schutzlayer für Zahlungsseiten.

Wie steht Ihre Domain bei Erweiterte Header?

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