DE | EN

Security Headers Guide

Alle wichtigen HTTP Security Headers erklärt: HSTS, CSP, X-Frame-Options und mehr. Mit Beispiel-Konfigurationen für Apache und Nginx.

Warum sind Security Headers wichtig?

HTTP Security Headers sind eine der einfachsten und effektivsten Methoden, um deine Website gegen häufige Angriffe zu schützen. Sie werden vom Server als HTTP-Response-Header gesendet und weisen den Browser an, bestimmte Sicherheitsrichtlinien durchzusetzen.

Neben dem direkten Sicherheitsgewinn sind sie auch ein Signal für Google: Websites mit HTTPS und korrekten Security Headers werden als vertrauenswürdiger eingestuft. Das kann sich positiv auf das Ranking auswirken.

Strict-Transport-Security (HSTS)

HSTS erzwingt, dass der Browser deine Website ausschließlich über HTTPS aufruft. Das verhindert Man-in-the-Middle-Angriffe und SSL-Stripping.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  • max-age: Wie lange (in Sekunden) der Browser HTTPS erzwingen soll. 31536000 = 1 Jahr.
  • includeSubDomains: Gilt auch für alle Subdomains.
  • preload: Ermöglicht die Aufnahme in die Browser-Preload-Liste, sodass HTTPS schon beim allerersten Besuch erzwungen wird.

Wichtig: Aktiviere HSTS erst, wenn du sicher bist, dass deine gesamte Website fehlerfrei über HTTPS funktioniert. Ein Rollback ist nicht einfach möglich.

Content-Security-Policy (CSP)

CSP ist der mächtigste Security Header. Er legt fest, von welchen Quellen der Browser Ressourcen laden darf. Das verhindert Cross-Site-Scripting (XSS) und Daten-Injektions-Angriffe.

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none'
  • default-src: Standard-Richtlinie für alle Ressourcentypen.
  • script-src: Erlaubte Quellen für JavaScript. Vermeide 'unsafe-inline' und 'unsafe-eval' wenn möglich.
  • style-src: Erlaubte Quellen für CSS.
  • img-src: Erlaubte Quellen für Bilder.
  • frame-ancestors: Verhindert, dass deine Seite in Frames eingebettet wird (ersetzt X-Frame-Options).

Tipp: Starte mit Content-Security-Policy-Report-Only, um Verstöße zu protokollieren, ohne Ressourcen zu blockieren. So kannst du die Policy schrittweise anpassen.

X-Frame-Options

Verhindert Clickjacking-Angriffe, indem die Seite nicht in einem <iframe> eingebettet werden kann.

X-Frame-Options: SAMEORIGIN
  • DENY: Die Seite kann nirgends eingebettet werden.
  • SAMEORIGIN: Nur Seiten der gleichen Domain dürfen die Seite einbetten.

Hinweis: frame-ancestors in der CSP ist die modernere Alternative und bietet mehr Kontrolle.

X-Content-Type-Options

Verhindert MIME-Type-Sniffing. Der Browser akzeptiert nur den deklarierten Content-Type und versucht nicht, den Typ selbst zu erraten — was bei Angriffen ausgenutzt werden kann.

X-Content-Type-Options: nosniff

Dieser Header hat nur einen gültigen Wert und sollte auf jeder Website gesetzt sein.

Referrer-Policy

Kontrolliert, welche Referrer-Informationen bei Navigation und Requests mitgesendet werden. Schützt die Privatsphäre deiner Nutzer.

Referrer-Policy: strict-origin-when-cross-origin
  • no-referrer: Sendet nie Referrer-Informationen.
  • strict-origin-when-cross-origin: Sendet den vollen Referrer bei gleicher Herkunft, nur die Origin bei Drittanbieter-Requests, und nichts bei HTTP→HTTPS-Downgrade. Guter Kompromiss.
  • same-origin: Referrer nur bei gleicher Herkunft.

Permissions-Policy

Kontrolliert, welche Browser-Features und APIs deine Website nutzen darf. Damit verhinderst du, dass eingebettete Drittanbieter-Inhalte auf sensible APIs zugreifen.

Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(self)
  • camera=(): Kamera-Zugriff für niemanden erlaubt.
  • microphone=(): Mikrofon-Zugriff deaktiviert.
  • geolocation=(): Standortabfrage deaktiviert.
  • payment=(self): Payment API nur für die eigene Seite.

Beispiel-Konfiguration

Apache (.htaccess)

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; frame-ancestors 'none'"

Nginx

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; frame-ancestors 'none'" always;

Security Headers testen

Nach der Konfiguration solltest du deine Headers testen:

  • PageScore: Prüft automatisch alle Security Headers und gibt Verbesserungsvorschläge.
  • Browser DevTools: Unter Network → Response Headers kannst du die gesendeten Header einsehen.
  • curl: curl -I https://deine-domain.de zeigt die Response-Header im Terminal.

Prüfe die Security Headers deiner Website jetzt mit PageScore — kostenlos und in Sekunden.