Zum Hauptinhalt springen

Was ist X-Frame-Options?

Der älteste und einfachste Schutz gegen Clickjacking — und wie der CSP-Nachfolger frame-ancestors ihn ablöst.

Was ist Clickjacking?

Bei einem Clickjacking-Angriff bettet ein Angreifer deine Webseite in einem unsichtbaren iframe in seine eigene Seite ein und legt darüber Köder-Buttons. Der Nutzer denkt, er klickt auf "Kostenlos teilnehmen" — tatsächlich klickt er aber durch den unsichtbaren Frame hindurch z. B. auf "Konto löschen" oder "Geld überweisen" auf deiner Webseite, in der er gerade eingeloggt ist. Klassische Opfer: Banking-Portale, Admin-Panels, Social- Media-Seiten mit Like-/Folgen-Buttons.

Wie X-Frame-Options funktioniert

Der HTTP-Header sagt dem Browser, ob deine Seite in einem <iframe>, <frame> oder <object> geladen werden darf. Drei Werte sind möglich:

  • DENY — die Seite darf grundsätzlich nicht eingebettet werden, auch nicht von der eigenen Domain. Strengste Option.
  • SAMEORIGIN — Einbettung nur durch Seiten der gleichen Domain. Nützlich für interne Admin-iframes.
  • ALLOW-FROM uri — erlaubt eine spezifische Domain. Veraltet, wird von Chrome und Safari nicht mehr unterstützt.

Konfigurationsbeispiele

nginx:

add_header X-Frame-Options "DENY" always;

Apache:

Header always set X-Frame-Options "SAMEORIGIN"

Express (Node.js):

app.use(helmet.frameguard({ action: 'deny' }))

Flask (Python):

@app.after_request
def set_frame_options(resp):
    resp.headers['X-Frame-Options'] = 'DENY'
    return resp

frame-ancestors — der moderne Nachfolger

Die Content-Security-Policy hat eine eigene Direktive für dasselbe Problem: frame-ancestors. Sie ist mächtiger und unterstützt alle modernen Browser. Vorteile gegenüber X-Frame-Options:

  • Mehrere erlaubte Quellen möglich — nicht nur eine.
  • Wildcards und Subdomain-Matching: *.partner.de.
  • Saubere Integration in die CSP-Strategie.

Beispiel:

Content-Security-Policy: frame-ancestors 'none';
Content-Security-Policy: frame-ancestors 'self' https://partner.de;

Beide Header gleichzeitig?

Empfehlung: Setze beide. X-Frame-Options für ältere Browser, die kein CSP-frame-ancestors verstehen; CSP-frame-ancestors für moderne Browser. Wenn beide gesetzt sind, gewinnt CSP. So bist du auf beiden Seiten abgesichert.

Was, wenn du legitime Embeds brauchst?

Falls Drittseiten deine Webseite tatsächlich einbetten sollen — etwa eingebettete Buchungs- Widgets, Login-Buttons oder Kommentar-Widgets — schalte X-Frame-Options gar nicht ein und nutze frame-ancestors mit einer präzisen Whitelist der erlaubten Domains. Niemals einfach * verwenden.

Selbst prüfen: HTTP-Header

HSTS, CSP, X-Frame-Options & Co. Gib eine Domain ein und sieh in Sekunden, wie es um deinen X-FRAME-OPTIONS steht.

Auch im Lexikon