Content Security Policy und Consent in TYPO3 13
Wie Sie eine Content Security Policy einführen, ohne die Seite zu brechen – und warum zur Einwilligung auch der Widerruf gehört.
Kurz: Eine Content Security Policy (CSP) legt fest, von wo eine Seite Skripte, Styles, Bilder und Einbettungen laden darf – eingeschleuster Code läuft dann nicht mehr. TYPO3 13 bringt sie mit: im Backend immer aktiv, im Frontend per Schalter. Wer sie einschaltet, findet schnell alle Stellen mit Inline-Skripten, in eigenen Templates, in Extensions, im Consent-Banner. Bewährt hat sich: erst nur melden lassen, dann erzwingen; fremde Dienste vollständig in die Domainliste, eigene Skripte mit Nonce; Tracking und Einbettungen erst nach der Einwilligung laden – und beim Widerruf wieder entfernen.
Was TYPO3 13 mitbringt
- Im Backend ist die CSP seit TYPO3 13.0 immer aktiv. Backend-Module von Extensions, die noch mit Inline-JavaScript arbeiten, fallen beim Upgrade von 12 auf 13 deshalb auf.
- Im Frontend schalten Sie sie ein, mit dem Feature-Schalter
security.frontend.enforceContentSecurityPolicy– oder zunächst nur mitsecurity.frontend.reportContentSecurityPolicy: Dann meldet der Browser Verstöße, blockiert aber nichts. - Je Site eine eigene Richtlinie in
config/sites/<site>/csp.yaml, aufbauend auf der Voreinstellung von TYPO3 (inheritDefault: true) und mit Änderungen (mutations) für die eigenen Quellen. - Ein Backend-Modul für Verstöße. Unter Admin Tools → Content Security Policy sammelt TYPO3 die gemeldeten Verstöße und schlägt Lösungen vor.
Erst melden, dann erzwingen
Die Reihenfolge, die sich in unseren Projekten bewährt hat:
- Bestandsaufnahme: Welche Skripte, Schriften, Tracker und Einbettungen lädt die Seite, und von wo?
- Nur melden lassen, einige Wochen lang, auf Staging und Live. Die Berichte können statt ins
TYPO3-Backend auch an einen eigenen Dienst gehen; in drei unserer Projekte laufen sie in Sentry auf.
Die Adresse dafür steht in
$GLOBALS['TYPO3_CONF_VARS']['FE']['contentSecurityPolicyReportingUrl']. - Beheben: Nonces in die Templates, Inline-Handler wie
onclickdurch Skriptdateien ersetzen, fehlende Quellen in diecsp.yaml. - Erzwingen – und die Berichte weiter beobachten, denn jede neue Einbettung kann einen neuen Verstoß bringen.
Ein Hinweis zum Backend-Modul: Lösungsvorschläge lassen sich dort per Klick übernehmen, über die
Oberfläche aber nicht wieder entfernen. Tragen Sie Freigaben besser von Hand in die csp.yaml ein –
dann stehen alle Regeln an einer Stelle und im Git.
Google-Dienste vollständig freigeben
Welche fremden Quellen eine Seite laden darf, steht in der csp.yaml als Liste von Domains. Bei
Google-Diensten wird sie lang: Nutzt eine Seite Google Analytics mit den Werbefunktionen von Google
Ads, lädt sie je nach Land von google.de, google.at, google.ch und so weiter – und die CSP erlaubt
keine Platzhalter am Ende eines Hostnamens. Jede Länderdomain muss einzeln hinein. In einem unserer
Projekte stehen deshalb 188 Google-Domains in der Richtlinie, über alle Direktiven zusammen mehr als 400
Einträge.
Google führt die nötigen Domains in seiner CSP-Anleitung auf und rät, die Einträge für die
Werbefunktionen gleich beim ersten Einrichten aufzunehmen. Dann muss die Richtlinie nicht geändert
werden, wenn später jemand Google Ads verknüpft. So gehen wir auch vor. Für Ihre Entwickler, in der
csp.yaml:
inheritDefault: true
mutations:
- mode: extend
directive: 'img-src'
sources:
- "https://*.google-analytics.com"
- "https://*.googletagmanager.com"
- "https://*.google.de"
- "https://*.google.com"
# … und die übrigen Länderdomains aus der Anleitung von Google
Eigene Skripte, die TYPO3 ausliefert, bekommen dagegen einen Nonce: einen Zufallswert, den TYPO3 für
jede Antwort neu erzeugt. In Fluid-Templates geschieht das über useNonce:
<f:asset.script identifier="main" src="EXT:sitepackage/Resources/Public/JavaScript/main.js" useNonce="1" />
Wo es in unseren Projekten hakte
- Das Standard-JavaScript von TYPO3. In einem Projekt blockierte die CSP das mitgelieferte
default_frontend.js, das unter anderem verschlüsselte E-Mail-Links auflöst. Abhilfe:config.removeDefaultJS = 1und die Datei selbst als Asset mituseNonce="1"einbinden. - Extensions ohne Nonce. Der Spamschutz von
wsm/form-spamshieldlädt sein Prüfskript ohne Nonce. Unter erzwungener CSP luden manche Browser es nicht – und ohne dieses Skript funktioniert der Spamschutz nicht. Abhilfe: das Partial der Extension im eigenen Sitepackage überschreiben unduseNonce="1"ergänzen. Rechnen Sie bei jeder Extension mit Frontend-JavaScript damit. - Consent-Banner mit Inline-Styles. Cookiebot setzt seine Styles inline, das Projekt erlaubt deshalb
'unsafe-inline'für Styles. Das ist ein vertretbarer Kompromiss, solange er auf Styles beschränkt bleibt und nicht auf Skripte übergreift.
Einwilligung: mehr als ein Banner
Nicht notwendige Cookies und Zugriffe auf das Endgerät brauchen nach § 25 TDDDG eine Einwilligung. Für die Technik heißt das:
- Erst nach der Einwilligung laden. Tracking, Videos, Karten und externe Schriften lädt die Seite erst, wenn der Besucher zugestimmt hat. Bis dahin zeigt sie einen Platzhalter. Die CSP muss die Quellen trotzdem kennen, auch die für Vorschaubilder, etwa bei YouTube.
- Beim Widerruf aufräumen. Viele Consent-Lösungen laden nach einem Widerruf nur nichts Neues mehr –
die schon gesetzten Cookies und Einträge im Local Storage bleiben. Prüfen Sie, dass sie gelöscht werden,
für Google Analytics etwa die Cookies
_gaund_ga_…. - Den Gültigkeitsbereich nicht nachträglich ändern. Ein Cookie ist über Name, Domain und Pfad
bestimmt. Stellt man die Einwilligung nachträglich auf Subdomains um, schreibt die Consent-Lösung ein
zweites Cookie mit anderer Domain, das alte bleibt. Bei wiederkehrenden Besuchern liegen dann zwei
Einwilligungen im Browser, und geänderte Einstellungen scheinen nicht zu greifen. In einem Projekt mit
sgalinski/sg-cookie-optinhaben wir das per Patch gelöst, der die alten Varianten vor dem Schreiben entfernt. - Google Consent Mode v2. Wer Google Ads oder Google Analytics für Besucher aus dem EWR nutzt, muss
Google seit März 2024 mitteilen, wozu eingewilligt wurde – mit den Signalen
ad_user_dataundad_personalizationzusätzlich zuad_storageundanalytics_storage. Zertifizierte Consent-Tools setzen sie selbst; bei einem eigenen Banner gehört das in die Integration.
Ob ein Banner rechtlich genügt, beurteilen Ihr Datenschutzbeauftragter oder Ihre Rechtsberatung. Die Technik muss nur dafür sorgen, dass vor der Einwilligung wirklich nichts lädt.
Prüfen Sie selbst
- Browser-Konsole: Meldungen mit „Content Security Policy“ zeigen blockierte Quellen.
- Netzwerk-Tab vor der Einwilligung: Es dürfen keine Anfragen an Google, YouTube oder andere Dritte laufen.
- Nach einem Widerruf: In den Entwicklerwerkzeugen unter „Speicher“ nachsehen, ob die Tracking-Cookies verschwunden sind.
Eine CSP gehört für uns zur Härtung jeder Installation, zusammen mit den übrigen Security-Headern – mehr dazu auf unserer Seite zum TYPO3 Hosting. Oder schreiben Sie uns über das Formular unten.
Stand: 24.9.2026 · Quellen: TYPO3 Explained: Content Security Policy, TYPO3: Modul Content Security Policy, Google Tag Platform: CSP, Google Tag Platform: Consent Mode, Google Ads: Consent Mode im EWR
Erstgespräch vereinbaren
Gerne beraten wir Sie in einem kostenlosen Erstgespräch.
Was passiert nach dem Absenden?
- Wir melden uns in der Regel innerhalb eines Werktages.
- Wir klären kurz Ihr Anliegen und schlagen die nächsten Schritte vor.
- Auf Wunsch vereinbaren wir ein kostenloses Erstgespräch (ca. 60 Min.).
Danke!
Wir haben Ihre Nachricht erhalten und melden uns umgehend.