WordPress Sicherheit

WordPress Sicherheit Headers: Was sie tun, warum sie fehlen – und wie du das in 5 Minuten prüfst

von Sven Kilcher·

WordPress sendet ohne Konfiguration keine Security Headers. Was das bedeutet, welche 8 Header wichtig sind und wie du deinen Status in Sekunden prüfst.

WordPress Sicherheit Headers: Was sie tun, warum sie fehlen – und wie du das in 5 Minuten prüfst

Du hast ein SSL-Zertifikat. Du machst regelmäßige Updates. Du nutzt ein Sicherheits-Plugin. Alles gut, oder?

Nicht ganz. Es gibt eine Kategorie von Sicherheitsmaßnahmen, die WordPress von sich aus nicht einrichtet – und die von den meisten Sicherheits-Plugins entweder gar nicht oder falsch gehandhabt wird: HTTP Security Headers.

Das Problem dabei ist nicht, dass sie schwer einzurichten wären. Das Problem ist, dass die meisten WordPress-Betreiber nie erfahren, dass sie fehlen. Die Website läuft, Google indexiert sie, niemand beschwert sich – und trotzdem fehlt ein wichtiger Schutzlayer, der Clickjacking, MIME-Sniffing und bestimmte XSS-Angriffe verhindern würde.

In diesem Beitrag erkläre ich, was Security Headers sind, welche 8 davon für WordPress-Websites relevant sind, und wie du in etwa fünf Minuten herausfindest, wie deine Website abschneidet.

Was sind HTTP Security Headers?

Wenn ein Browser deine Website aufruft, schickt der Server nicht nur HTML zurück – er schickt auch eine Reihe von Antwort-Headern. Die meisten davon sind technischer Natur (Inhaltstyp, Caching, Weiterleitungen). Security Headers sind eine Teilmenge dieser Header, die dem Browser mitteilen, wie er die Website behandeln soll.

Konkret heißt das: du kannst dem Browser sagen, ob deine Seite in einem iframe eingebettet werden darf (relevant für Clickjacking-Schutz), ob er den Dateityp von Ressourcen selbst “erraten” soll oder ob du ihm das verbietest, und welche externen Quellen legitim Skripte auf deiner Seite ausführen dürfen.

Der Browser setzt diese Regeln durch – automatisch, ohne dass dein WordPress-Code irgendwas davon mitbekommt.

Das ist der Vorteil: Wenn ein Angreifer es schafft, bösartigen Code in ein Plugin einzuschleusen, kann ein gut gesetzter Content-Security-Policy-Header trotzdem verhindern, dass dieser Code etwas anrichten kann, weil der Browser die Ausführung blockiert.

Das Plugin-Problem

Jetzt kommt der Grund, warum das Thema in der WordPress-Welt so oft unter den Tisch fällt.

Es gibt Plugins, die Security Headers setzen. Das klingt nach einer einfachen Lösung. Aber die Realität ist komplizierter:

Plugins setzen Header per PHP. Das passiert spät im Request – nach WordPress-Core, nach Themes, nach anderen Plugins. Wenn irgendwo in dieser Kette jemand die Header überschreibt, sind deine Security Headers weg. Du siehst das nicht im Admin-Dashboard.

Caching-Plugins können das Problem verstärken. Wenn Seiten gecacht werden, bevor dein Security-Header-Plugin läuft, werden möglicherweise Seiten ohne Header ausgeliefert.

CDN und Proxy-Layer. Viele WordPress-Websites laufen hinter Cloudflare oder einem nginx-Reverse-Proxy. Beide können Header modifizieren oder entfernen. Das Plugin weiß davon nichts.

Das Ergebnis: Dein Plugin zeigt dir grüne Häkchen. Aber was der Browser tatsächlich empfängt, kann vollständig anders aussehen. Das lässt sich nur von außen prüfen – indem du die echten Response-Header abrufst, die beim Besucher ankommen.

Die 8 Security Headers, die für WordPress wichtig sind

1. Content-Security-Policy (CSP)

Der mächtigste und komplexeste Header. Er definiert, welche Ressourcen der Browser laden darf – und von wo. Ein striktes CSP verhindert, dass ein Angreifer auch dann JS ausführen kann, wenn er Code in deine Seite einschleusen konnte.

Der Haken: CSP ist anspruchsvoll zu konfigurieren, weil viele WordPress-Themes und -Plugins externe Ressourcen einbinden. Ein zu striktes CSP bricht die Website; ein zu lockeres nützt wenig. Nutze unseren CSP Generator, um eine saubere Policy aufzubauen.

Beispiel-Wert: Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-xyz'; img-src 'self' data:

2. Strict-Transport-Security (HSTS)

Dieser Header sagt dem Browser: Ruf diese Website nie über HTTP auf – immer HTTPS. Das klingt trivial, wenn du bereits eine SSL-Umleitung hast. Aber ohne HSTS ist der erste Request noch angreifbar (Man-in-the-Middle). Mit HSTS merkt sich der Browser nach dem ersten Besuch, dass er immer HTTPS verwenden soll.

Wichtig: max-age sollte mindestens 31536000 Sekunden (1 Jahr) betragen, und includeSubDomains sollte gesetzt sein, wenn du Subdomains nutzt.

Beispiel-Wert: Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

3. X-Frame-Options

Dieser Header verhindert, dass deine Website in einem <iframe> auf einer fremden Website eingebettet wird. Das klassische Angriffsszenario: Clickjacking. Der Angreifer blendet deine Website unsichtbar über einer anderen Seite ein, und der Nutzer klickt, ohne es zu wissen, auf Buttons deiner Website.

Für die meisten WordPress-Websites ist SAMEORIGIN der richtige Wert – also nur eigene Seiten dürfen einbetten.

Beispiel-Wert: X-Frame-Options: SAMEORIGIN

4. X-Content-Type-Options

Browser versuchen manchmal, den Dateityp einer Ressource selbst zu erraten, wenn der Server keinen klaren Content-Type angibt. Das nennt sich MIME-Sniffing. Angreifer können das ausnutzen, indem sie eine Datei so hochladen, dass der Browser sie als JavaScript interpretiert, obwohl sie offiziell als Bild deklariert ist.

nosniff deaktiviert dieses Verhalten.

Beispiel-Wert: X-Content-Type-Options: nosniff

5. Referrer-Policy

Wenn jemand auf deiner Website auf einen externen Link klickt, schickt der Browser standardmäßig die vollständige URL deiner Seite als “Referrer” mit. Das kann sensible Informationen preisgeben (z. B. interne Seitennamen, Parameter, Login-Pfade).

strict-origin-when-cross-origin ist ein guter Kompromiss: Der Referrer wird beim Wechsel auf eine andere Domain auf den reinen Hostnamen reduziert.

Beispiel-Wert: Referrer-Policy: strict-origin-when-cross-origin

6. Permissions-Policy

Früher “Feature-Policy” genannt. Damit kannst du festlegen, welche Browser-Features deine Website nutzen darf – und welche nicht. Kamera, Mikrofon, Standort, Accelerometer. Wenn deine Website keinen dieser Zugriffe braucht, solltest du sie explizit verbieten.

Beispiel-Wert: Permissions-Policy: camera=(), microphone=(), geolocation=()

7. X-XSS-Protection (veraltet)

Dieser Header existiert noch, wird aber nicht mehr empfohlen. Er war für alte Browser gedacht, die keinen eigenen XSS-Filter hatten. Moderne Browser ignorieren ihn oder haben ihn ganz entfernt. Wenn du ihn noch irgendwo gesetzt hast: ersetze ihn durch eine saubere CSP.

8. Cross-Origin-Opener-Policy (COOP)

Der neueste der acht. Er isoliert deinen Browser-Tab von anderen Tabs und verhindert, dass externe Seiten, die du öffnest, über JavaScript-Referenzen auf dein Tab zugreifen können. Relevant für Websites mit Login oder sensibler Funktionalität.

Beispiel-Wert: Cross-Origin-Opener-Policy: same-origin

Der Fehler, den fast alle machen

Wer das Thema recherchiert, findet schnell .htaccess-Snippets wie diesen:

<IfModule mod_headers.c>
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-Content-Type-Options "nosniff"
    Header set Strict-Transport-Security "max-age=31536000"
</IfModule>

Einfügen, fertig, grüne Häkchen bei securityheaders.com – so lautet die gängige Anleitung.

Das Problem: Nach dem Einbauen prüft niemand mehr, ob die Header beim Besucher tatsächlich ankommen. Und das tun sie nicht immer. Ein paar typische Szenarien, wo Header still und leise verschwinden:

  • Cloudflare überschreibt oder entfernt bestimmte Header je nach Plan und Konfiguration
  • WP Rocket oder W3 Total Cache liefern gecachte Seiten aus, bevor PHP-basierte Header gesetzt werden können
  • nginx als Reverse-Proxy vor Apache hat eigene Header-Konfigurationen, die Priorität haben
  • Managed WordPress Hosting (Kinsta, WP Engine, Flywheel) konfiguriert Header auf Server-Ebene – manchmal richtig, manchmal gar nicht

Das lässt sich nicht durch Blick ins Plugin-Dashboard oder die .htaccess klären. Du musst von außen schauen.

Wie du deine Security Headers prüfst

Dafür haben wir den HTTP Security Headers Checker gebaut.

URL eingeben, Prüfung starten. Das Tool fetcht serverseitig die echten Response-Header deiner Website – also das, was der Browser eines echten Besuchers tatsächlich empfängt. Dann analysiert es alle 8 Header, berechnet einen Security Score von 0–100 und zeigt dir konkret, was fehlt oder schwach konfiguriert ist.

Für jeden problematischen Header gibt es direkt den passenden Code: als .htaccess-Block, als nginx-Direktive oder als PHP-Snippet für die functions.php. Kopieren, einbauen, nochmal prüfen.

Das Tool ist kostenlos, ohne Registrierung, und speichert keine Inhalte deiner Website – nur die Response-Header werden analysiert.

Security Headers in WordPress einrichten: Drei Wege

Wenn der Check zeigt, dass Header fehlen, hast du im Wesentlichen drei Optionen:

Weg 1: .htaccess (empfohlen für Apache-Hosting)

Füge den Header-Block in deine .htaccess im WordPress-Stammverzeichnis ein, vor dem WordPress-Block. Funktioniert auf den meisten Shared-Hosting-Paketen und ist unabhängig von Plugins.

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
    Header always set Cross-Origin-Opener-Policy "same-origin"
</IfModule>

Beachte always statt set – das stellt sicher, dass die Header auch bei 3xx- und 4xx-Antworten gesetzt werden.

Weg 2: functions.php (oder Must-Use-Plugin)

Wenn du keinen Zugriff auf .htaccess hast oder nginx nutzt, kannst du Header per PHP setzen:

add_action( 'send_headers', function() {
    header( 'Strict-Transport-Security: max-age=31536000; includeSubDomains; preload' );
    header( 'X-Frame-Options: SAMEORIGIN' );
    header( 'X-Content-Type-Options: nosniff' );
    header( 'Referrer-Policy: strict-origin-when-cross-origin' );
    header( 'Permissions-Policy: camera=(), microphone=(), geolocation=()' );
    header( 'Cross-Origin-Opener-Policy: same-origin' );
} );

Setze das besser in ein Must-Use-Plugin (/wp-content/mu-plugins/) statt in die functions.php des Themes – dann bleibt es bei Theme-Wechseln und Theme-Updates erhalten.

Weg 3: Nginx-Konfiguration

Wenn du Zugriff auf die nginx-Serverkonfiguration hast (VPS, eigener Server), sind Header auf Server-Ebene die sicherste Option – sie werden unabhängig von WordPress gesetzt und können von keinem Plugin überschrieben werden.

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" 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 "camera=(), microphone=(), geolocation=()" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;

Nach dem Einrichten: Nochmal prüfen

Das klingt trivial, wird aber häufig vergessen: Nach jeder Änderung nochmal mit dem HTTP Security Headers Checker prüfen. Nicht weil der Code falsch ist, sondern weil Caching, CDN-Layer oder Hosting-Konfigurationen dazwischenfunken können.

Auch nach größeren WordPress-Updates, Plugin-Updates oder Hosting-Migrationen lohnt sich ein erneuter Check. Security Headers können durch Serverkonfigurationsänderungen leise verschwinden, ohne dass irgendetwas sichtbar kaputt geht.

Für wen sind Security Headers besonders wichtig?

Technisch sollte jede öffentliche WordPress-Website Security Headers setzen. Praktisch gibt es Fälle, wo der Aufwand besonders gut begründet ist:

WooCommerce-Shops verarbeiten Zahlungsdaten und Kundendaten – hier sind HSTS und eine strikte CSP keine Kür, sondern Pflicht.

Membership-Websites und Login-Bereiche profitieren besonders von X-Frame-Options und Cross-Origin-Opener-Policy, weil Clickjacking-Angriffe oft auf Login-Formulare abzielen.

Websites mit Kontaktformularen und Nutzereingaben sollten eine CSP haben, die Inline-Scripts einschränkt, um XSS-Vektoren zu reduzieren.

Agenturen und Freelancer, die Websites für Kunden betreiben, sollten Security Headers in ihr Standard-Setup aufnehmen. Es ist ein kleiner Aufwand mit messbarem Ergebnis – und erklärt sich Kunden gut, wenn du einen Score vorher/nachher zeigen kannst.


Security Headers gesetzt, aber willst du sicherstellen, dass deine CSP sauber konfiguriert ist? Nutze den CSP Generator von WP Helping Hand, um eine WordPress-kompatible Content Security Policy aufzubauen.

FAQ

Das willst du wissen

Beeinflussen Security Headers die Performance meiner Website?
Nein. Sie fügen nur wenige Bytes zu jedem Response-Header hinzu, was bei normaler Website-Größe keine messbare Auswirkung hat.
Kann ein falsches HSTS meine Website unzugänglich machen?
Ja – wenn du HSTS setzt, aber kein funktionierendes SSL-Zertifikat hast, oder wenn du später auf HTTP zurückwechseln willst, bevor max-age abgelaufen ist. Teste daher zuerst auf einer Staging-Umgebung.
Warum zeigt mein Sicherheits-Plugin grüne Häkchen, aber der Checker findet trotzdem Probleme?
Plugins prüfen meist nur, ob sie die Header gesetzt haben – nicht, ob sie beim Besucher ankommen. CDN, Caching und Proxy-Layer können dazwischenfunken. Nur ein externer Check zeigt, was wirklich ausgeliefert wird.
Ich nutze Cloudflare – regelt das nicht alles automatisch?
Cloudflare setzt von sich aus HSTS (optional aktivierbar) und einige andere Header. Was genau gesetzt wird, hängt von deinem Plan und den Einstellungen ab. Prüf es lieber explizit, statt es zu vermuten.
Sind Security Headers ein Google-Rankingfaktor?
Nicht direkt. Google hat Security Headers nie als Rankingfaktor bestätigt. HTTPS ist ein bekannter (kleiner) Faktor – und HSTS gehört dazu. Mittelbar verbessert eine sichere Website das Nutzervertrauen, was sich auf Conversion und indirekt auf Rankings auswirken kann.
Muss ich CSP setzen, wenn ich schon X-Frame-Options habe?
Das sind unterschiedliche Schutzebenen. X-Frame-Options schützt vor Clickjacking. CSP schützt u.a. vor XSS und kontrolliert das Laden externer Ressourcen. Beide ergänzen sich. Da CSP auch frame-ancestors unterstützt, gilt CSP als modernerer Ersatz für X-Frame-Options, aber alte Browser verstehen letzteres besser. Im Zweifel beide setzen.
Was ist der Unterschied zwischen 'Header set' und 'Header always set' in .htaccess?
Header set gilt nur für 2xx-Antworten. Header always set gilt für alle HTTP-Status-Codes inklusive Weiterleitungen (3xx) und Fehlern (4xx, 5xx). Für Security Headers ist always in der Regel die richtige Wahl.
Wie oft sollte ich meine Security Headers prüfen?
Nach dem initialen Einrichten: nach jedem größeren WordPress-Update, nach Plugin-Updates die Skripte einbinden, nach Hosting-Migrationen und nach CDN-Konfigurationsänderungen. Einmal pro Quartal als Routine ist ein guter Rhythmus.
Sven Kilcher – WordPress Freelancer
WordPress Freelancer

Die WP Helping Hand, WordPress Freelancer

Sven Kilcher

Ich bin Sven, dein erfahrener Partner für alles rund um WordPress. Mit über 8 Jahren Expertise und mehr als 120 zufriedenen Kunden stehe ich dir zur Seite, um deine Website professionell zu gestalten, zu warten und weiterzuentwickeln. Ob es um maßgeschneiderte Lösungen oder regelmäßige Wartungen geht – ich bin für dich da.

44
Alter
8 Jahre
Erfahrung
120+
Kunden
50+
Wartungen