Clickjacking, oft auch Klickjacking genannt, gehört zu den unangenehmen Browser-Angriffen, weil der sichtbare Klick nicht das auslöst, was der Nutzer erwartet. Statt einer harmlosen Interaktion landet die Aktion im Hintergrund auf einem anderen Element, meist in einem eingebetteten Frame mit einer manipulierten Oberfläche. Ich zeige hier, wie die Technik funktioniert, welche Angriffsmuster in der Praxis auftauchen und welche Schutzmaßnahmen für Webanwendungen wirklich tragen.
Das Wichtigste auf einen Blick
- Der Angriff täuscht den Menschen, nicht den Browser: Ein Klick trifft ein anderes Ziel als das sichtbare Element.
- Die wichtigste Abwehr ist die saubere Kontrolle darüber, ob eine Seite überhaupt eingebettet werden darf.
-
Content-Security-Policy: frame-ancestorsist heute die präziseste Schutzmaßnahme,X-Frame-Optionsbleibt als Zusatz sinnvoll. -
SameSite-Cookies und CSRF-Schutz reduzieren Folgeschäden, ersetzen aber keinen Framing-Schutz. - Für Nutzer gibt es nur begrenzte Gegenmaßnahmen, deshalb gehört die eigentliche Verteidigung in die Anwendung.

Was Clickjacking eigentlich ist
Technisch geht es um eine manipulierte Benutzeroberfläche, die eine echte Seite überlagert oder in den Hintergrund drückt. Der Angreifer baut meist ein unsichtbares oder kaum sichtbares iframe ein und legt darüber ein anderes Element, das harmlos aussieht. Der sichtbare Button ist also nur Kulisse; tatsächlich wird eine Aktion auf der Zielseite ausgelöst. Der wichtigste Gedanke ist: Der Angriff täuscht nicht den Browser, sondern den Menschen.
Genau das macht die Methode so effektiv. Sie braucht kein Schadprogramm auf dem Gerät und keine kaputte Server-Logik, sondern nur eine Situation, in der ein Nutzer einer Oberfläche vertraut. Besonders kritisch wird es, wenn die betroffene Seite bereits eingeloggt ist und mit einem einzigen Klick etwas auslöst, das Konsequenzen hat: Freigaben, Änderungen an Kontodaten, Löschungen oder Autorisierungen. Ich trenne deshalb immer sauber zwischen Sichtschutz und echter Zugriffskontrolle. Beides muss sitzen, aber es ist nicht dasselbe.
Im Sicherheitskontext wird auch von UI Redressing gesprochen. Der Begriff trifft den Kern gut: Die Benutzeroberfläche wird so umgebaut, dass der Klick an einer anderen Stelle landet, als das Auge vermutet. Genau dort beginnt die eigentliche Angriffskette, und von dort aus lassen sich die typischen Muster am besten verstehen.
Wie der Angriff im Browser abläuft
Der Ablauf ist in der Praxis oft erstaunlich simpel. Die Zielseite wird in einem Frame geladen, darüber liegt eine transparente oder sehr unauffällige Schicht, und die sichtbaren Inhalte werden so platziert, dass der Nutzer glaubt, auf etwas Unkritisches zu klicken. Wenn das Timing stimmt, trifft der Klick den versteckten Button darunter. Das funktioniert besonders gut bei Aktionen, die visuell klein sind, aber technisch viel bewirken.
Lesen Sie auch: Phishing erkennen & abwehren – So schützen Sie sich wirklich
Typischer Aufbau
- Die Zielseite wird in einem eingebetteten Frame geöffnet.
- Darüber liegt ein transparentes oder optisch getarntes Overlay.
- Der sichtbare Inhalt lenkt ab oder motiviert zum Klick.
- Der eigentliche Klick landet auf einer Schaltfläche der Zielseite.
Besonders gefährlich sind Schaltflächen, die sofort eine echte Wirkung haben, etwa das Bestätigen einer Zahlung, das Ändern einer Adresse oder das Aktivieren einer Freigabe. In solchen Fällen braucht der Angreifer oft nur einen einzigen gut platzierten Klick. Genau deshalb sind Schutzheader und saubere Sitzungsregeln so wichtig: Ohne Einbettung gibt es keinen sauberen Angriffspfad. Damit ist der technische Kern klar, und im nächsten Schritt lohnt sich der Blick auf die Szenarien, in denen das in Projekten tatsächlich auftaucht.
Wo der Angriff in der Praxis auftaucht
Ich sehe solche Angriffe vor allem dort, wo ein Klick eine unmittelbare Folge hat oder eine Oberfläche stark auf Vertrauen baut. Das kann ein internes Admin-Panel sein, ein Self-Service-Portal, ein Zahlungsdialog oder eine Social-Media-Funktion. Die Oberfläche selbst ist dabei nicht das Problem. Problematisch wird es erst, wenn sie ohne klare Einbettungskontrolle von fremden Seiten aus bedient werden kann.
| Szenario | Was der Angreifer ausnutzt | Warum es relevant ist |
|---|---|---|
| Social-Media-Funktionen | Like-, Follow- oder Share-Schaltflächen | Eine scheinbar harmlose Aktion verändert Sichtbarkeit oder Reichweite |
| Admin-Oberflächen | Löschen, Rollen ändern, Schlüssel erzeugen | Ein Fehlklick kann administrative Folgen haben |
| Self-Service-Portale | Adresse, E-Mail oder Zahlungsdaten ändern | Angriffe zielen auf Kontodaten und Identitätswechsel |
| Freigabe- und Bestätigungsdialoge | Autorisieren, erlauben, bestätigen | Der sichtbare Kontext wirkt harmlos, die Wirkung ist aber ernst |
In allen Fällen nutzt der Angreifer dieselbe Schwäche: Das Auge sieht eine andere Seite als der Browser tatsächlich bedient. Genau deshalb sind visuelle Täuschung und technische Einbettung so eng miteinander verbunden. Und genau dort setzt die wirksame Verteidigung an.
Welche Schutzmechanismen wirklich zählen
OWASP behandelt die Abwehr als Defense in Depth: Ein einzelner Mechanismus reicht im Zweifel nicht. Das ist die richtige Haltung, denn bei Webanwendungen ist selten nur ein Fehler vorhanden. Ich plane heute zuerst mit einer klaren Einbettungsregel auf HTTP-Ebene und ergänze sie dann um kompatible Fallbacks und Sitzungsregeln.
| Maßnahme | Wirkung | Wann ich sie nutze |
|---|---|---|
Content-Security-Policy: frame-ancestors 'none' |
Verhindert jede Einbettung | Wenn die Seite nie in einem Frame erscheinen soll |
Content-Security-Policy: frame-ancestors 'self' https://partner.example |
Erlaubt nur definierte Elternseiten | Wenn Einbettung kontrolliert nötig ist |
X-Frame-Options: DENY oder SAMEORIGIN
|
Einfache Schutzschicht für ältere oder zusätzliche Kompatibilität | Als Ergänzung und Fallback |
SameSite=Lax oder Strict
|
Reduziert die Mitgabe von Session-Cookies in eingebetteten Kontexten | Für Login- und Sitzungscookies |
| JavaScript-Frame-Busting | Versucht, das Laden im Frame zu verhindern | Nur als Zusatz, nicht als Hauptlösung |
Wichtig ist die Reihenfolge im Denken: Zuerst entscheide ich, ob Framing überhaupt erlaubt sein soll. Erst danach kommen Ausnahmen. Die Direktiven gehören in den HTTP-Header, nicht in ein meta-Tag. Auch das BSI empfiehlt für Webanwendungen geeignete HTTP-Response-Header, und das ist in der Praxis kein theoretischer Rat, sondern ein sehr handfester Schutzschritt. Wenn eine Anwendung wirklich eingebettet werden muss, dann nur über eine explizite Allowlist und nie über großzügige Platzhalter.
Damit steht die Schutzarchitektur auf einer sauberen Basis. Der nächste Schritt ist die konkrete Umsetzung in einer Anwendung, ohne dass sich im Alltag wieder Ausnahmen einschleichen.
Wie ich eine Webanwendung absichere
Wenn ich eine Anwendung härte, gehe ich sehr pragmatisch vor. Ich prüfe zuerst, ob die Seite überhaupt in einem Frame laufen muss. Wenn nicht, wird das Einbetten vollständig blockiert. Wenn doch, dann werden die erlaubten Elternseiten sehr eng definiert. Das klingt simpel, ist aber der Punkt, an dem viele Projekte unnötig unscharf werden.
- Ich entscheide zuerst, ob Einbettung technisch und fachlich nötig ist.
- Wenn nicht, setze ich
Content-Security-Policy: frame-ancestors 'none';. - Zusätzlich ergänze ich
X-Frame-Options: DENYoderSAMEORIGINals Fallback. - Wenn Einbettung gebraucht wird, erlaube ich nur exakt bekannte Ursprünge.
- Session-Cookies bekommen
SameSite=LaxoderStrict. - Kritische Aktionen laufen über sichere Methoden, CSRF-Token und klare Serverprüfungen.
Wichtig ist auch der Umfang. Ich sichere nicht nur die Startseite, sondern alle HTML-Antworten, die für einen Angriff interessant sein könnten. Gerade Login, Dashboard und sensible Aktionsseiten werden in vielen Projekten unterschiedlich behandelt, obwohl sie denselben Schutz brauchen. Wenn ein Partnerportal oder ein internes Widget bewusst eingebettet werden soll, dokumentiere ich die erlaubten Domains und teste jede einzelne Herkunft separat. Das ist aufwendiger als ein pauschales Offenlassen, aber deutlich robuster.
So wird aus einer bloßen Header-Idee eine belastbare Schutzlinie. Im Alltag scheitern viele Teams aber nicht an der Theorie, sondern an typischen Fehlannahmen, und genau die sind oft gefährlicher als die eigentliche Lücke.
Welche Fehler ich in Projekten am häufigsten sehe
Die meisten Fehlkonfigurationen sind unspektakulär, aber genau deshalb hartnäckig. Sie wirken auf den ersten Blick wie Schutz, decken aber nur einen Teil des Problems ab. Ich sehe dabei immer wieder dieselben Muster.
- Der Schutz wird nur per
meta-Tag eingebaut. Das funktioniert für diese Header nicht. - Es wird nur die Startseite abgesichert, nicht aber die wirklich kritischen Bereiche.
- Framing wird erlaubt, ohne die erlaubten Quellen präzise zu begrenzen.
- JavaScript-Frame-Busting wird als alleinige Lösung betrachtet.
- CSRF-Token werden eingebaut, aber die Einbettung bleibt offen.
- Mehrere Subdomains werden pauschal als vertrauenswürdig behandelt, obwohl sie fachlich unterschiedliche Risiken haben.
Der letzte Punkt ist besonders wichtig. Viele Organisationen unterschätzen, wie breit eine übermäßig offene Allowlist wirkt. Was intern bequem erscheint, ist aus Sicht der Angriffsfläche schnell zu großzügig. Dazu kommt ein häufiger Denkfehler: Clickjacking und CSRF sind nicht dasselbe, können sich aber gegenseitig verstärken, wenn beide Schutzschichten schwach sind. Ich behandle sie deshalb immer gemeinsam.
Wenn diese typischen Fehler bekannt sind, lässt sich die technische Absicherung deutlich zielgerichteter prüfen. Für Nutzer bleibt trotzdem eine Restunsicherheit, und genau da lohnt sich ein ehrlicher Blick auf die Grenzen auf Client-Seite.
Was Nutzer selbst tun können und wo die Grenze liegt
Für einzelne Nutzer gibt es keine perfekte Einstellung, die das Problem komplett löst, wenn die Zielseite das Einbetten erlaubt. Das ist die unbequeme Wahrheit. Was hilft, ist vor allem Aufmerksamkeit bei unerwarteten Oberflächen, eingebetteten Dialogen und Buttons, die in einem fremden Kontext auftauchen. Wenn eine Seite seltsam eingerahmt wirkt oder ein kritischer Schritt plötzlich in einem kleinen eingeblendeten Bereich stattfindet, würde ich den Vorgang abbrechen und die Zielseite direkt im neuen Tab öffnen.
- Browser und Sicherheitsupdates aktuell halten.
- Misstrauisch sein, wenn eine scheinbar harmlose Seite zur schnellen Bestätigung drängt.
- Bei Login-, Zahlungs- und Freigabeschritten die Domain bewusst prüfen.
- Ungewöhnliche eingebettete Dialoge nicht einfach wegklicken.
Diese Maßnahmen sind sinnvoll, aber sie bleiben begrenzt. Der eigentliche Schutz muss auf Seiten der Anwendung passieren, nicht beim einzelnen Klickverhalten. Genau deshalb ist die sichere Konfiguration eines Webprojekts die entscheidende Ebene und nicht die Hoffnung auf das vorsichtige Verhalten aller Nutzer. Im letzten Schritt fasse ich deshalb die Schutzlogik so zusammen, wie ich sie in einem Review sofort bewerten würde.
Woran ich in einem Review zuerst hinschaue
Meine Baseline ist klar: keine Einbettung ohne echten fachlichen Bedarf, sensible Seiten mit frame-ancestors 'none', dazu X-Frame-Options: DENY als zusätzliche Kante und Session-Cookies mit SameSite=Lax oder Strict. Wenn eine Anwendung bewusst eingebettet werden soll, arbeite ich mit einer expliziten Allowlist und teste jede erlaubte Quelle separat. Alles andere ist auf Dauer zu weich.
Der schnellste Realitätscheck ist für mich immer derselbe: Kann die Seite in einem fremden Frame geladen werden, obwohl sie das nicht sollte? Wenn ja, ist der Schutz unvollständig. Wenn nein, und wenn die kritischen Aktionen zusätzlich serverseitig sauber abgesichert sind, ist das Risiko deutlich reduziert. Genau diese Kombination macht in der Praxis den Unterschied zwischen einer theoretischen und einer belastbaren Abwehr.