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.