Security-Header-Architektur für Contao

Drei Konfigurationswege im Vergleich: Natives CSP-Backend (5.3+), Symfony EventSubscriber für zentrale Header-Verwaltung und .htaccess-Fallback für Apache-basiertes Hosting.

Contao · Schritt für Schritt

Architektur-Überblick für Contao

Contao basiert auf Symfony und bietet dadurch drei saubere Konfigurationswege für Security Headers. Der Wolf-Agents Web Security Check prüft 166 Punkte und zeigt Ihnen, welche Header Ihre Contao-Installation bereits setzt und wo Handlungsbedarf besteht.

Natives CSP-Backend (ab 5.3) für die Content Security Policy, ein Symfony EventSubscriber für alle weiteren Header, und die public/.htaccess als Apache-Fallback. Die Kombination aus EventSubscriber und nativem CSP-Backend ist die empfohlene Architektur.

Zentrale Header-Konfiguration

Der EventSubscriber ist der empfohlene Weg für alle Header außer CSP. Er reagiert auf jede HTTP-Response und setzt die Header zentral — unabhängig von Cache-Schicht oder Hosting-Umgebung.

EventSubscriber (empfohlen)
SecurityHeaderSubscriber.php Empfohlen
<?php
// src/EventSubscriber/SecurityHeaderSubscriber.php

namespace App\EventSubscriber;

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', 0]];
  }

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

    // Basis Security Headers
    $response->headers->set('Strict-Transport-Security',
      'max-age=31536000; includeSubDomains; preload');
    $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=()');
  }
}
Service registrieren
config/services.yaml Konfiguration
# config/services.yaml — Service registrieren
services:
  App\EventSubscriber\SecurityHeaderSubscriber:
    tags: ['kernel.event_subscriber']
.htaccess Fallback
public/.htaccess Fallback
# public/.htaccess — Security Headers Fallback
<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
  Header always set X-Content-Type-Options "nosniff"
  Header always set X-Frame-Options "SAMEORIGIN"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
  Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>
Contao Managed Edition

Bei der Managed Edition liegt die .htaccess unter public/.htaccess. Der EventSubscriber wird in src/EventSubscriber/ angelegt und über config/services.yaml registriert. Bei Autoconfiguration erkennt Symfony den EventSubscriber automatisch.

Verifizierung

Nach der Konfiguration leeren Sie den Contao-Cache und prüfen die Header per curl. Ohne cache:clear werden Änderungen am EventSubscriber nicht wirksam.

Terminal Verifizierung
# Cache leeren (PFLICHT nach jeder Änderung)
vendor/bin/contao-console cache:clear

# Security Headers prüfen
curl -sI https://ihre-domain.de | grep -iE "strict-transport|x-content-type|x-frame|referrer-policy|permissions-policy"

# Erwartete Ausgabe:
# strict-transport-security: max-age=31536000; includeSubDomains; preload
# x-content-type-options: nosniff
# x-frame-options: SAMEORIGIN
# referrer-policy: strict-origin-when-cross-origin
# permissions-policy: camera=(), microphone=(), geolocation=()

Häufige Fehler bei der Architektur in Contao

contao-console cache:clear vergessen

Nach jeder Änderung am EventSubscriber oder an config.yaml muss vendor/bin/contao-console cache:clear ausgeführt werden. Ohne Cache-Invalidierung sehen Sie weiterhin die alten Header.

Contao-Extension überschreibt Header-Konfiguration

Manche Contao-Extensions registrieren eigene EventSubscriber mit höherer Priorität, die Ihre Header überschreiben. Prüfen Sie mit debug:event-dispatcher kernel.response die Subscriber-Reihenfolge.

Content-Elemente Inline-Styles blockiert

Contao-Content-Elemente nutzen Inline-Styles für Abstände und Ausrichtung. Wenn Sie CSP konfigurieren, beachten Sie, dass 'unsafe-inline' in style-src nötig sein kann — oder nutzen Sie Nonces über den CspHandler.

Compliance-Relevanz

Eine konsolidierte Header-Architektur ist Voraussetzung für die Compliance-Anforderungen, die besonders für Behörden- und Agenturwebsites auf Contao-Basis relevant sind.

NIS2Art. 21(e) — Sicherheit bei Erwerb, Entwicklung und Wartung von Netz- und Informationssystemen
BSIAPP.3.1 — Webserver-Absicherung mit Security Headern
DSGVOArt. 32 — Technische Maßnahmen zum Schutz personenbezogener Daten

Wie steht Ihre Domain bei Implementierungs-Architektur?

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