Sicherheits-Ratgeber
Response-Header gehören zu den günstigsten Maßnahmen mit der größten Wirkung, um die Besucher Ihrer Website zu schützen. Diese Seite ist die Landkarte: ein kurzer Überblick über jeden Header, der sich lohnt, und der Einstieg in die Themen, die mehr als eine Zeile Konfiguration brauchen.
Eingereichte Scans werden öffentlich auf der Seite mit den aktuellen Scans gelistet. Mit dem Scannen gelten unsere AGB.
01 Die Header
Eine Karte je Header, mit dem, was er bewirkt, warum er sich lohnt und einer Zeile zum Kopieren. Wo es einen eigenen Ratgeber gibt, verlinkt die Karte ihn.
Strict-Transport-Security HSTS Was er bewirkt. Weist den Browser an, Ihre Website ausschließlich über HTTPS aufzurufen, und diese Entscheidung für die angegebene max-age zu merken. Ab dem zweiten Besuch stellt der Browser jede Anfrage selbst auf HTTPS um, bevor überhaupt Daten das Gerät verlassen.
Warum er wichtig ist. Ohne HSTS kann ein Angreifer im Netzwerk die erste unverschlüsselte Anfrage abfangen und die Verbindung herunterstufen. HSTS schließt dieses Zeitfenster und macht die verschlüsselte Übertragung verbindlich.
Empfohlener Wert. max-age=63072000; includeSubDomains; preload
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; Content-Security-Policy CSP Was er bewirkt. Legt eine Positivliste der Quellen fest, aus denen eine Seite Skripte, Stylesheets, Bilder und andere Ressourcen laden darf, und kann Inline-Skripte vollständig verbieten.
Warum er wichtig ist. Das ist der wirksamste Schutz gegen Cross-Site-Scripting (XSS). Selbst wenn ein Angreifer ein Script-Tag einschleust, führt der Browser es nur aus, wenn die Richtlinie dessen Quelle erlaubt. Beginnen Sie im Report-Only-Modus und schalten Sie danach auf erzwingend um.
Empfohlener Wert. default-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'
add_header Content-Security-Policy "default-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'" always; X-Frame-Options Was er bewirkt. Steuert, ob Ihre Seiten auf fremden Websites in einem Frame oder Iframe eingebettet werden dürfen. DENY verbietet jedes Einbetten, SAMEORIGIN erlaubt es nur der eigenen Domain.
Warum er wichtig ist. Der Header verhindert Clickjacking, bei dem ein Angreifer Ihre Seite unsichtbar über seine eigene legt, um Klicks abzufangen. Moderne Browser werten zusätzlich die CSP-Direktive frame-ancestors aus, dieser Header deckt jedoch auch ältere Clients ab.
Empfohlener Wert. SAMEORIGIN
add_header X-Frame-Options "SAMEORIGIN" always; X-Content-Type-Options Was er bewirkt. Mit dem Wert nosniff weisen Sie den Browser an, dem angegebenen Content-Type zu vertrauen und niemals einen anderen zu erraten (MIME-Sniffing).
Warum er wichtig ist. MIME-Sniffing kann aus einem harmlos wirkenden Upload ein ausführbares Skript machen. Ein einziger, unkritischer Wert schaltet eine ganze Kategorie solcher Verwechslungsangriffe ab.
Empfohlener Wert. nosniff
add_header X-Content-Type-Options "nosniff" always; Referrer-Policy Was er bewirkt. Bestimmt, wie viel der aufrufenden URL übermittelt wird, wenn ein Besucher Ihre Website über einen Link verlässt oder eine Ressource von Dritten geladen wird.
Warum er wichtig ist. Vollständige Referrer geben Pfade, Tokens oder Suchbegriffe an fremde Server weiter. Eine strenge Richtlinie übermittelt gerade genug für Ihre Web-Analyse und hält sensible URLs zurück.
Empfohlener Wert. strict-origin-when-cross-origin
add_header Referrer-Policy "strict-origin-when-cross-origin" always; Permissions-Policy Was er bewirkt. Erlaubt es, mächtige Browser-Funktionen wie Kamera, Mikrofon und Standortabfrage für Ihre Website und alle eingebetteten Inhalte abzuschalten.
Warum er wichtig ist. Wenn Ihre Website die Kamera ohnehin nie braucht, kann auch ein kompromittierter oder bösartiger eingebetteter Inhalt nicht danach fragen. Sie reduzieren die Angriffsfläche auf die Funktionen, die Sie tatsächlich nutzen.
Empfohlener Wert. geolocation=(), camera=(), microphone=(), payment=(), usb=()
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=(), usb=()" always; Set-Cookie Cookies Was er bewirkt. Streng genommen kein Security-Header, aber der Response-Header, der über die Sicherheit einer Sitzung entscheidet: Secure, HttpOnly und SameSite legen fest, wer ein Cookie lesen darf und wann es mitgeschickt wird.
Warum er wichtig ist. Ein Sitzungs-Cookie ohne HttpOnly kann jedes Skript auslesen, das es auf die Seite schafft, und eines ohne SameSite reist bei Anfragen von fremden Seiten mit. Beides macht aus einem kleinen Fehler eine Kontoübernahme.
Empfohlener Wert. name=value; Secure; HttpOnly; SameSite=Lax
Set-Cookie: name=value; Secure; HttpOnly; SameSite=Lax Cross-Origin-Opener-Policy COOP Was er bewirkt. Stellt Ihre Seiten in eine eigene Browsing-Context-Gruppe, sodass ein Fenster, das Ihres geöffnet hat oder das Ihre Seite geöffnet hat, nicht mehr über die Fensterreferenz hineingreifen kann.
Warum er wichtig ist. Ohne den Header behält ein fremder Opener einen Zugriff auf Ihre Seite und kann deren Navigationszustand abfragen. Er ist außerdem der erste der drei Header, die eine Seite braucht, bevor ein Browser ihr Cross-Origin-Isolation gewährt.
Empfohlener Wert. same-origin
add_header Cross-Origin-Opener-Policy "same-origin" always; Cross-Origin-Resource-Policy CORP Was er bewirkt. Legt fest, wer Ihre Antworten als Subressource einbinden darf: nur Ihre eigene Origin, nur Ihre eigene Site oder jeder beliebige Dritte.
Warum er wichtig ist. Er schützt vor Seitenkanal-Angriffen, die Ressourcen auslesen, die sie nie sehen durften, und ist der einzige Weg, Bilder, Skripte und Datendateien nicht in fremde Seiten ziehen zu lassen.
Empfohlener Wert. same-origin
add_header Cross-Origin-Resource-Policy "same-origin" always; Cross-Origin-Embedder-Policy COEP Was er bewirkt. Verlangt, dass jede eingebundene Cross-Origin-Ressource ausdrücklich zustimmt, über CORP oder CORS.
Warum er wichtig ist. Erst mit COEP gewährt der Browser Cross-Origin-Isolation, auf die mächtige Funktionen wie SharedArrayBuffer und hochauflösende Timer angewiesen sind. Darüber hinaus vervollständigt er den Isolationssatz: ohne ihn landen Ressourcen fremder Herkunft im Prozess der Seite, ohne zugestimmt zu haben.
Empfohlener Wert. require-corp
add_header Cross-Origin-Embedder-Policy "require-corp" always; Reporting-Endpoints Was er bewirkt. Nennt den Endpunkt, an den der Browser Berichte schickt: Richtlinienverstöße, Deprecations, Abstürze und, zusammen mit NEL, die Netzwerkfehler, die Ihren Server nie erreicht haben.
Warum er wichtig ist. Ohne Endpunkt passiert jeder Verstoß still im Browser eines Fremden. Das ist der Unterschied zwischen einer Richtlinie, die Sie mit Belegen verschärfen können, und einer, die Sie nur raten können.
Empfohlener Wert. default="https://example.com/report"
add_header Reporting-Endpoints 'default="https://example.com/report"' always;
add_header NEL '{"report_to":"default","max_age":10886400}' always; X-XSS-Protection Entfernen Was er bewirkt. Der XSS-Auditor-Schalter alter Browser. Aktuelle Browser ignorieren ihn, und die wenigen, die ihn noch auswerten, aktivieren einen Filter, mit dem sich Seiten aufbrechen ließen, die gar nicht verwundbar waren.
Warum er wichtig ist. Er schützt heute nicht mehr, erzeugt aber den Eindruck von Schutz. In alten Browsern lässt sich der Filter von außen steuern, um Teile einer Seite zu unterdrücken oder Inhalte über Origin-Grenzen hinweg auszuleiten; sicher ist deshalb, ihn nicht zu senden.
Diesen Header nicht setzen. Senden Sie ihn wie gezeigt ausgeschaltet oder lassen Sie ihn besser ganz weg.
add_header X-XSS-Protection "0" always; 02 Warum sie wichtig sind
Ein Browser glaubt zunächst alles, was ihm Ihr Server mitteilt. Security-Header sind kurze Anweisungen in jeder HTTP-Antwort, die festlegen, wie er sich verhalten soll: welchen Verbindungen er trauen darf, welche Inhalte er laden darf und wie viele Informationen er nach außen gibt. Sind sie sauber gesetzt, laufen ganze Angriffsklassen ins Leere - vom erzwungenen Protokoll-Downgrade über Clickjacking bis zu Cross-Site-Scripting. Fehlen sie, greifen die großzügigen Voreinstellungen des Browsers.
03 Im Detail
Die meisten Header sind eine Zeile, die Sie einmal setzen. Acht sind es nicht: eine Content Security Policy muss zu Ihrer eigenen Website passen, HSTS trägt eine Entscheidung, die sich nicht schnell zurücknehmen lässt, Cookie-Attribute stehen in Ihrer Anwendung statt im Webserver, und die Regeln zu Referrer, Berechtigungen und Einbettung tauschen jeweils ein wenig Bequemlichkeit gegen viel Schutz. Zwei weitere liegen ganz ausserhalb der Antwort: die DNS-Einträge, die verhindern, dass in Ihrem Namen Mails verschickt werden, und die Datei, die Sicherheitsforschern sagt, wohin sie ihren Fund melden. Und zwei behandeln die Zeit nach dem Go-live: ein Header, der am Tag der Veröffentlichung stimmte, kann nach dem nächsten Deploy fehlen oder aufgeweicht sein, und das zu bemerken braucht mehr als eine einmalige Prüfung. Jedes dieser Themen hat einen eigenen Ratgeber.
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.
04 Server-Rezepte
Zu wissen, welcher Header gesetzt gehört, ist die halbe Arbeit. Diese Seiten liefern die fertige Konfiguration für die sieben Plattformen, nach denen wir am häufigsten gefragt werden, mit der Erklärung Zeile für Zeile und den Fehlerbildern, bei denen eine Konfiguration richtig aussieht und nichts sendet.
Ein vollständiger Server-Block zum Einfügen, was jede add_header-Zeile macht, und die Vererbungsregel, die jeden Header still entfernt, sobald eine Location einen eigenen definiert.
Der .htaccess-Block zum Einfügen, warum mod_headers zuerst aktiv sein muss und was der Unterschied zwischen set und always für Ihre Fehlerseiten bedeutet.
Jeder Header mit wenigen Zeilen und ohne Plugin, an einer Stelle, die ein Theme-Update nicht entfernt, plus die eine Richtlinie, die Ihren Block-Editor zerlegt.
Der web.config-Block zum Einfügen, was jeder customHeaders-Eintrag macht und warum eine web.config im Unterordner denselben Header zweimal ausliefert.
Jeder Header aus einem Konfigurationsarray und ohne Extension, warum das Backend eine eigene Richtlinie braucht und welche Dateien TYPO3 nie erreichen.
Ein Response-Subscriber für die ganze Storefront, warum die Administration ausgenommen gehört und was eine strenge Richtlinie mit Ihren Zahlungsanbietern macht.
Das eine Feld, in dem Ihre Direktiven überleben, warum das Bearbeiten der generierten vhost-Datei sinnlos ist und was der Proxy-Modus an Doppelungen ändert.
05 Alles zusammen
Tragen Sie die Direktiven in den server-Block ein, der Ihre Website ausliefert, laden Sie nginx neu und testen Sie. Führen Sie Content-Security-Policy behutsam ein: erst Content-Security-Policy-Report-Only setzen, beobachten, was blockiert worden wäre, und anschließend auf den erzwingenden Header wechseln, sobald die Richtlinie zu Ihrer Website passt.
server {
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=(), usb=()" always;
} 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 prüft Ihre ausgelieferten Response-Header zusammen mit Datenschutz, Nachhaltigkeit, Barrierefreiheit, SEO und Performance - und erklärt jeden Befund verständlich.