Server-Rezept
TYPO3 kann jeden Header selbst senden, mit einem Konfigurationsarray und ohne Extension. Was es nicht kann: die Dateien abdecken, die Ihr Webserver ausliefert, ohne TYPO3 je zu fragen.
01 Wohin es gehört
TYPO3 sendet die Header aus der FE-Header-Konfiguration mit jeder Frontend-Antwort. Das Array gehört in config/system/additional.php, die nach der generierten settings.php gelesen wird und, anders als diese, nicht überschrieben wird, wenn jemand im Install-Tool speichert.
Die Grenze steckt im Namen: FE heißt Frontend. Dateien unter fileadmin und die kompilierten Assets liefert Apache oder nginx aus, ohne dass TYPO3 überhaupt läuft, sie bekommen also keinen dieser Header. Gehört Ihnen der Webserver, setzen Sie sie dort und lassen dieses Array weg; gehört er Ihnen nicht, behalten Sie das Array und wissen, dass Ihre Bilder und Stylesheets blank rausgehen.
02 Das Rezept
Ein sicherer Ausgangspunkt für ein Frontend, das seine eigenen Dateien lädt. X-Frame-Options steht bewusst auf SAMEORIGIN statt DENY: das Backend zeigt die Seitenvorschau in einem iframe auf demselben Ursprung, und mit DENY sehen Ihre Redakteure einen leeren Kasten.
<?php $GLOBALS['TYPO3_CONF_VARS']['FE']['headers'] = [ 'Strict-Transport-Security' => 'max-age=63072000; includeSubDomains',
'Content-Security-Policy' => "default-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'",
'X-Frame-Options' => 'SAMEORIGIN',
'X-Content-Type-Options' => 'nosniff',
'Referrer-Policy' => 'strict-origin-when-cross-origin',
'Permissions-Policy' => 'geolocation=(), camera=(), microphone=(), payment=(), usb=()', ]; Zwei Anpassungen, bevor das Ihres ist. Die Content-Security-Policy erlaubt nichts von Dritten und blockiert eingebundene Karten, Schriften, Analyse und die meisten Extensions, die irgendetwas Externes laden; fangen Sie deshalb mit Content-Security-Policy-Report-Only an. Und das Backend ist eine eigene Frage: TYPO3 12 und neuer bringen eine eigene Backend-Richtlinie mit, konfiguriert in Configuration/ContentSecurityPolicies.php, die dieses Array nicht anfasst.
03 Zeile für Zeile
Jeder Eintrag aus dem Block oben einzeln, damit Sie weglassen können, was nicht zu Ihrer Seite passt, statt etwas einzufügen, das Sie nicht erklären können.
Strict-Transport-Security Was er macht. Legt Browser darauf fest, Ihre Seite zwei Jahre lang nur über HTTPS zu erreichen. Setzen Sie ihn am Webserver, wenn Sie können, dann gilt er auch für Anfragen, die TYPO3 nie erreichen, und fügen Sie ihn erst hinzu, wenn HTTPS auf jeder Subdomain funktioniert.
'Strict-Transport-Security' => 'max-age=63072000; includeSubDomains', Content-Security-Policy Was er macht. Fangen Sie hiermit an und nicht mit der erzwingenden Fassung. Report-Only ändert für Besucher nichts, sagt Ihnen aber, was eine strenge Richtlinie blockiert hätte, und das ist auf einer TYPO3-Seite mit einer Handvoll Extensions üblicherweise mehr als erwartet.
'Content-Security-Policy' => "default-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'",
'Content-Security-Policy-Report-Only' => "default-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; report-uri /csp-report", X-Frame-Options Was er macht. SAMEORIGIN statt DENY, weil die Seitenvorschau im Backend das Frontend in einem iframe lädt. DENY zerlegt sie, und Ihre Redakteure melden das als ausgefallene Website.
'X-Frame-Options' => 'SAMEORIGIN', X-Content-Type-Options Was er macht. Sagt dem Browser, Ihren angegebenen Inhaltstypen zu vertrauen, statt zu raten. Auf jeder Seite sicher, und auf einer, auf der Redakteure Dateien hochladen, nimmt er eine ganze Angriffsklasse aus dem Spiel.
'X-Content-Type-Options' => 'nosniff', Referrer-Policy Was er macht. Sendet die vollständige Adresse innerhalb Ihrer eigenen Seite und nach außen nur die bloße Domain. Der Wert für nahezu jede öffentliche TYPO3-Seite.
'Referrer-Policy' => 'strict-origin-when-cross-origin', Permissions-Policy Was er macht. Schaltet Kamera, Mikrofon, Standort, Bezahlfunktion und USB-Zugriff für Ihre Seiten und alles Eingebettete ab. Erweitern Sie die Liste, statt sie zu kürzen: Funktionen, die Sie nicht nennen, bleiben verfügbar, auch für das, was eine Extension einbettet.
'Permissions-Policy' => 'geolocation=(), camera=(), microphone=(), payment=(), usb=()', 04 Nachprüfen
Die Header werden je Antwort gesetzt und nicht mit der gecachten Seite gespeichert, ein TYPO3-Cache-Flush ist also nicht zwingend. Ein Reverse Proxy vor TYPO3 ist eine andere Sache: er legt Header zusammen mit dem Inhalt ab und liefert weiter die Antwort aus, die er vor Ihrem Array eingefangen hat.
vendor/bin/typo3 cache:flush curl -sI https://example.com | grep -i "^strict-transport\|^content-security\|^x-frame" curl -sI https://example.com/fileadmin/logo.png | grep -i "^x-content-type" Prüfen Sie eine Datei unter fileadmin und nicht nur eine Seite. Steht der Header auf der Seite und fehlt an der Datei, ist das die Frontend-Grenze von oben und kein Fehler in Ihrer Konfiguration.
05 Fragen
Sie funktioniert, und auf einer älteren Installation haben Sie vermutlich genau das schon. Das FE-Header-Array gilt für jede Frontend-Antwort einschließlich der Fehlerseiten, steht in einer Datei statt in jedem TypoScript-Template und hängt nicht daran, dass ein Template überhaupt geladen ist. Sind beide gesetzt, kann der Header zweimal rausgehen.
Sollte es nicht sein, denn dieses Array gilt nur im Frontend. Ist das Backend wirklich betroffen, kommt der Header von Ihrem Webserver und nicht von TYPO3, und dort gehört die Behebung hin: den Backend-Pfad ausnehmen oder ihm eine eigene Richtlinie geben.
Ja, die Frontend-Header-Konfiguration gibt es seit Version 10. Geändert hat sich später die Backend-Seite: die eigene Content Security Policy für das Backend kam mit Version 12, davor musste eine strenge Backend-Richtlinie vom Webserver kommen.
Die können das, meist über eine PSR-15-Middleware, und dann gehen zwei Werte für denselben Header raus. Suchen Sie Ihre Extensions nach header- und withHeader-Aufrufen ab, bevor Sie annehmen, dieses Array sei die einzige Quelle, und legen Sie je Header einen Eigentümer fest.
06 Im Detail
Diese Seite ist die Konfiguration. Diese Ratgeber erklären, was jeder Header wirklich macht und wie Sie seinen Wert wählen.
Was jeder Response-Header bewirkt, welche Ihre Website senden sollte und wie Sie sie richtig konfigurieren.
Der stärkste Schutz gegen Cross-Site-Scripting: welche Direktiven Sie setzen, wie Sie eine Richtlinie im Report-Only-Modus einführen und wie Sie erzwingend werden, ohne Ihre Website zu zerlegen.
Strict-Transport-Security erklärt: was max-age, includeSubDomains und preload wirklich bewirken und warum die Preload-Liste eine Entscheidung ist, die Sie nicht schnell zurücknehmen können.
Secure, HttpOnly und SameSite: die Cookie-Attribute, die eine Sitzung vor Skripten und fremden Seiten schützen, samt Einstellungen für einen typischen Stack.
Wie eine unsichtbare Überlagerung aus einem Besucherklick eine Aktion auf Ihrer Website macht, und die zwei Header, die das verhindern: X-Frame-Options für ältere Clients, frame-ancestors für alles andere.
Welcher Teil Ihrer URLs an fremde Seiten geht, wenn ein Besucher weiterklickt: die fünf Werte, die zählen, was jeder davon preisgibt und welcher der sinnvolle Standard ist.
Kamera, Mikrofon, Standort und Bezahlfunktion für Ihre Website und alle eingebetteten Inhalte abschalten: die Syntax der Positivliste und warum eine nicht genannte Funktion keine abgeschaltete Funktion ist.
Die Einträge, die verhindern, dass jemand in Ihrem Namen Mails verschickt, und der, der Ihre DNS-Antworten ehrlich hält: was jeder leistet und in welcher Reihenfolge Sie sie einführen.
Die Datei, die Sicherheitsforschern sagt, wohin eine Schwachstelle gemeldet wird. Zwei Pflichtfelder, zehn Minuten Arbeit, und der Unterschied zwischen einer privaten und einer öffentlichen Meldung.
Ein Header, der heute stimmt, kann nach dem nächsten Deploy fehlen. Drei Wege, das zu bemerken: ein Cronjob mit curl, eine Prüfung in Ihrer CI-Pipeline und ein geplanter Scan, jeweils mit dem, was er findet und was nicht.
Wie sich eine Richtlinie durch Deploys, Plugins und CDN-Regeln unbemerkt ändert und wie Sie es merken: ein Header-Diff, Verstoßmeldungen über report-to und was ein Scan-Vergleich zeigen kann und was nicht.
Weiterlesen
Jeder Ratgeber steht für sich, zusammen decken sie ab, worauf unser Scanner schaut. Wählen Sie den, der Ihrer nächsten Frage am nächsten kommt.
Unser kostenloser Quickscan liest die Header aus Ihrer ausgelieferten Antwort und nicht aus Ihrer Konfigurationsdatei, und erklärt jeden Befund verständlich.