CSP in Drupal konfigurieren

Content Security Policy in Drupal einrichten — CSP-Modul mit Nonce-Support, seckit CSP-Tab oder Custom EventSubscriber. Von Report-Only über Violation-Analyse bis Enforcement.

Drupal · Schritt für Schritt

Content Security Policy in Drupal

Content Security Policy (CSP) ist der wichtigste HTTP-Security-Header gegen Cross-Site Scripting (XSS). Er teilt dem Browser mit, welche Ressourcen geladen werden dürfen — und blockiert alles andere. CSP ist mit 35 von 166 Punkten der einflussreichste Header im Wolf-Agents Web Security Check.

Drupal bietet drei Wege für CSP: Das drupal.org/project/csp-Modul mit nativem Nonce-Support und CKEditor-Kompatibilität, den seckit CSP-Tab für einfache Policies ohne Nonces, oder einen Custom EventSubscriber für maximale Kontrolle. Die größte Herausforderung ist die Kompatibilität mit CKEditor, der Inline-Styles und Inline-Scripts nutzt.

CSP-Implementierung in Drupal

Beginnen Sie immer im Report-Only-Modus. Der Browser meldet Verstöße in der Konsole, blockiert aber keine Ressourcen. Wählen Sie Ihre Methode basierend auf den Anforderungen: CSP-Modul für Nonces, seckit für einfache Policies, EventSubscriber für volle Kontrolle.

CSP-Modul (empfohlen)
Terminal Nonce-Support
# CSP-Modul installieren (empfohlen für Nonce-Support)
composer require drupal/csp
drush en csp -y
drush cr

# Konfiguration unter:
# /admin/config/system/csp
# Report-Only und Enforced getrennt konfigurierbar
seckit CSP-Tab
/admin/config/system/seckit Admin-UI
# seckit CSP-Tab: /admin/config/system/seckit
# → Tab "Content Security Policy"
# Felder pro Direktive ausfüllen:

default-src: 'self'
script-src:  'self'
style-src:   'self' 'unsafe-inline'
img-src:     'self' data:
font-src:    'self'
object-src:  'none'
base-uri:    'self'
form-action: 'self'

# Checkbox: "Report Only" zuerst aktivieren!
EventSubscriber
CspSubscriber.php Custom
<?php
// modules/custom/security_headers/src/EventSubscriber/CspSubscriber.php

namespace Drupal\security_headers\EventSubscriber;

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

class CspSubscriber implements EventSubscriberInterface {

  public static function getSubscribedEvents() {
    return [KernelEvents::RESPONSE => ['onResponse', 0]];
  }

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

    $csp = implode('; ', [
      "default-src 'self'",
      "script-src 'self'",
      "style-src 'self' 'unsafe-inline'",
      "img-src 'self' data: https:",
      "font-src 'self'",
      "object-src 'none'",
      "base-uri 'self'",
      "form-action 'self'",
      "frame-ancestors 'none'",
      "upgrade-insecure-requests",
    ]);

    // Report-Only zuerst, dann Enforcement
    $response->headers->set(
      'Content-Security-Policy-Report-Only', $csp);
  }
}
CKEditor und CSP: CKEditor nutzt Inline-Styles. Fügen Sie 'unsafe-inline' zu style-src hinzu. Für script-src verwenden Sie Nonces über das CSP-Modul — niemals 'unsafe-inline' für Scripts.

Verifizierung und Enforcement

Lassen Sie die Policy mindestens eine Woche im Report-Only-Modus laufen. Testen Sie alle Seitentypen — Startseite, Blog-Artikel, Formulare, Benutzer-Login und besonders den CKEditor im Admin-Bereich.

Terminal Verifizierung
# Cache leeren
drush cr

# CSP-Header prüfen
curl -sI https://ihre-domain.de | grep -i content-security-policy

# Erwartete Ausgabe (Report-Only):
# content-security-policy-report-only: default-src 'self'; ...
Automatisiertes Monitoring

Der Wolf-Agents Web Security Check bewertet Ihren CSP-Header mit bis zu 35 Punkten. Mit aktivem Monitoring werden Sie bei Änderungen oder fehlenden Headern sofort benachrichtigt.

Häufige Fehler bei CSP in Drupal

CKEditor Inline-Styles von CSP blockiert

CKEditor nutzt Inline-Styles extensiv. Ohne 'unsafe-inline' in style-src funktioniert der Editor nicht. Das CSP-Modul handhabt dies automatisch — bei manueller Konfiguration müssen Sie style-src 'self' 'unsafe-inline' setzen.

Views-Modul lädt externe Ressourcen

Views mit eingebetteten Medien oder externen Feldern können Ressourcen laden, die von der CSP blockiert werden. Prüfen Sie Views-Ausgaben auf externe URLs und ergänzen Sie die CSP-Direktiven entsprechend.

Mehrere Module setzen CSP-Header

Wenn sowohl das CSP-Modul als auch seckit CSP-Header setzen, überschreibt der letzte den ersten. Verwenden Sie nur ein Modul für CSP — nicht beide gleichzeitig. Deaktivieren Sie den CSP-Tab in seckit, wenn Sie das CSP-Modul nutzen.

Internal Page Cache liefert gecachte Header

Drupals Internal Page Cache cached auch HTTP-Header. Nach CSP-Änderungen müssen Sie mit drush cr den Cache leeren. Auf Produktivseiten kann der Cache dazu führen, dass verschiedene Benutzer unterschiedliche CSP-Header sehen.

Compliance-Relevanz

Eine korrekte Content Security Policy erfüllt zentrale Anforderungen mehrerer Compliance-Frameworks. CSP ist besonders relevant für E-Commerce-Seiten und Organisationen, die personenbezogene Daten verarbeiten.

PCI DSS 4.0Anforderung 6.4.3 — Kontrolle aller auf Zahlungsseiten geladenen Scripts (seit März 2025 verpflichtend)
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 gegen XSS-basierte Datenexfiltration

Wie steht Ihre Domain bei Content Security Policy?

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