Reporting API für Shopware 6

Report-To und Reporting-Endpoints per EventSubscriber — CSP-Violations und Browser-Warnungen automatisch erfassen und auswerten.

Shopware · Schritt für Schritt

Reporting API in Shopware 6

Reporting API ermöglicht es Browsern, Sicherheitsverletzungen (CSP-Violations, Deprecation-Warnungen, Netzwerkfehler) automatisch an einen Endpoint zu senden. Statt manuell in der Browser-Console nach Fehlern zu suchen, erhalten Sie automatisierte Reports über alle Violations Ihrer Kunden. Die Reporting API ist mit 4 von 166 Punkten im Wolf-Agents Web Security Check bewertet.

In Shopware 6 konfigurieren Sie die Reporting-Endpoints per EventSubscriber und ergänzen die CSP-Konfiguration in shopware.yaml um die report-to-Direktive. Shopware unterstützt vier CSP-Kontexte: storefront, administration, store-api und default. Für einen vollständigen Report-Feed sollten Sie alle Kontexte konfigurieren.

Besonders wertvoll ist die Reporting API für Shopware-Shops mit vielen Payment-Providern und Plugins: Jede neue Integration kann unbekannte CSP-Violations auslösen. Ohne Reporting bemerken Sie diese erst, wenn Kunden sich beschweren. Mit einem Report-Collector sehen Sie Violations in Echtzeit und können proaktiv reagieren. Der Wolf-Agents Web Security Scanner prüft, ob Reporting-Endpoints konfiguriert sind.

Implementierung

Variante A: EventSubscriber für Reporting-Endpoints Header. Variante B: CSP report-to in shopware.yaml. Variante C: Report-Collector-Endpoint als Custom Plugin.

Variante A — EventSubscriber
SecurityHeaderSubscriber.phpEmpfohlen
// SecurityHeaderSubscriber.php — Reporting API
public function onResponse(ResponseEvent $event): void
{
    $response = $event->getResponse();

    // Reporting-Endpoints Header (neue API, Chrome 96+)
    $response->headers->set(
        'Reporting-Endpoints',
        'csp-endpoint="https://ihr-shop.de/api/csp-report", '
        . 'default="https://ihr-shop.de/api/reports"'
    );

    // Report-To Header (ältere API, Fallback für Firefox)
    $reportTo = json_encode([
        'group' => 'csp-endpoint',
        'max_age' => 86400,
        'endpoints' => [
            ['url' => 'https://ihr-shop.de/api/csp-report'],
        ],
    ]);
    $response->headers->set('Report-To', $reportTo);
}
Variante B — CSP-Reporting
config/packages/shopware.yamlCSP-Reporting
# config/packages/shopware.yaml — CSP mit Reporting
shopware:
    security:
        csp_templates:
            storefront:
                # Neue API: report-to Direktive
                report-to: "csp-endpoint"
                # Ältere API: report-uri (Fallback)
                report-uri: "https://ihr-shop.de/api/csp-report"

            # Auch für Administration und Store-API
            administration:
                report-to: "csp-endpoint"
                report-uri: "https://ihr-shop.de/api/csp-report"
Variante C — Report-Collector
ReportCollectorController.phpEndpoint
// Report-Collector: Einfacher Endpoint in einem Custom Plugin
// src/Controller/ReportCollectorController.php

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Psr\Log\LoggerInterface;

#[Route(defaults: ['_routeScope' => ['api']])]
class ReportCollectorController
{
    public function __construct(
        private readonly LoggerInterface $logger
    ) {}

    #[Route('/api/csp-report', methods: ['POST'])]
    public function collect(Request $request): JsonResponse
    {
        $report = json_decode($request->getContent(), true);

        // Bekannte Violations filtern (Payment-Provider)
        if ($this->isKnownViolation($report)) {
            return new JsonResponse(['status' => 'filtered']);
        }

        $this->logger->warning('CSP Violation', [
            'report' => $report,
        ]);

        return new JsonResponse(['status' => 'received']);
    }
}
Report-Endpoint absichern

Der Endpoint empfängt JSON-Daten vom Browser und kann ohne Authentifizierung aufgerufen werden. Sichern Sie ihn mit Rate-Limiting (z.B. 100 Requests/Minute pro IP) und loggen Sie keine sensiblen Daten aus den Violation-Reports (URLs können Session-Tokens enthalten). Setzen Sie Access-Control-Allow-Origin: * damit Browser von jeder Seite Reports senden können.

Verifizierung

Prüfen Sie drei Aspekte: Reporting-Header in der Response vorhanden, Report-Endpoint erreichbar und antwortet mit 200, und CSP-Violations werden tatsächlich gesendet. Testen Sie auch mit verschiedenen Browsern — Chrome und Firefox unterstützen unterschiedliche API-Versionen.

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

# 2. Reporting-Header prüfen
curl -sI https://ihr-shop.de | grep -iE "report-to|reporting-endpoints"
# Erwartete Ausgabe:
# reporting-endpoints: csp-endpoint="https://ihr-shop.de/api/csp-report"
# report-to: {"group":"csp-endpoint","max_age":86400,...}

# 3. Report-Endpoint testen
curl -X POST https://ihr-shop.de/api/csp-report \
  -H "Content-Type: application/json" \
  -d '{"csp-report":{"document-uri":"https://test.de"}}'
# Erwartete Ausgabe: {"status":"received"}

# 4. CSP-Violation in Browser DevTools auslösen
# Console: Prüfen ob Violation an Endpoint gesendet wird
Tipp: Starten Sie mit Content-Security-Policy-Report-Only statt Content-Security-Policy. So erhalten Sie Reports ohne Funktionalität zu blockieren — ideal zum Sammeln aller benötigten CSP-Regeln vor dem Scharf-Schalten.

Häufige Fehler

Reporting-Endpoint nicht erreichbar

Browser senden Reports nur an erreichbare HTTPS-Endpoints. Testen Sie den Endpoint mit curl -X POST und einem JSON-Body. Der Endpoint muss mit Status 200 oder 204 antworten — bei 404 oder 500 verwirft der Browser zukünftige Reports.

CORS-Fehler beim Report-Empfang

Wenn der Report-Endpoint auf einer anderen Domain liegt, muss er CORS-Header senden: Access-Control-Allow-Origin: * und Access-Control-Allow-Methods: POST. Ohne CORS verwirft der Browser die Reports stillschweigend.

Report-Flut durch Payment-Provider

Payment-Provider-iFrames (PayPal, Stripe, Klarna) können hunderte CSP-Violations pro Minute erzeugen. Filtern Sie bekannte Violations im Report-Collector: URLs die paypal.com, stripe.com oder klarna.com enthalten, können ignoriert oder aggregiert werden.

JSON-Escaping im Report-To Header

Der Report-To Header erwartet valides JSON. Achten Sie auf korrekte Escaping in PHP — verwenden Sie json_encode() statt manueller String-Konkatenation. Fehlerhafte JSON-Syntax führt dazu, dass der Browser den Header ignoriert.

Compliance-Relevanz

PCI DSS 4.0 Requirement 6.4.3 — Monitoring von Script-Violations auf Zahlungsseiten. Die Reporting API ist der empfohlene Mechanismus, um unerlaubte Script-Ausführungen auf Checkout-Seiten zu erkennen — ein zentraler Schutz gegen Magecart-Angriffe.
NIS2 Art. 21(b) — Bewältigung von Sicherheitsvorfällen durch automatisierte Erkennung. CSP-Violation-Reports ermöglichen die frühzeitige Erkennung von Web-Skimming und injiziertem Code.
BSI DET.1 — Detektion von sicherheitsrelevanten Ereignissen. Die Reporting API ist ein passives Detektionssystem, das ohne Eingriff in den Datenfluss arbeitet.
OWASP ASVS V14.4 — Security Logging und Monitoring. CSP-Violation-Reports sind eine Form von clientseitigem Security Logging, das serverseitige Logs ergänzt.

Wie steht Ihre Domain bei Reporting API?

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