Reporting API für Shopware 6
Report-To und Reporting-Endpoints per EventSubscriber — CSP-Violations und Browser-Warnungen automatisch erfassen und auswerten.
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.
// 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);
} # 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" // 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']);
}
} 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.
# 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 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
Wie steht Ihre Domain bei Reporting API?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.