Il clickjacking (UI redressing o UI spoofing) è un attacco in cui la vittima viene indotta a cliccare su un elemento di un’interfaccia che non vede, perché nascosto sotto un’interfaccia apparentemente innocua. L’attaccante carica la pagina bersaglio (es. il pannello di controllo di un servizio in cui la vittima è autenticata) in un <iframe> trasparente sovrapposto a una pagina-esca, allineando un elemento interattivo (pulsante “Conferma”, “Autorizza”, “Pubblica”) esattamente sotto qualcosa che l’utente è invitato a cliccare.
Il risultato è che la vittima esegue un’azione reale sul sito bersaglio — modifica delle impostazioni, trasferimento fondi, cambio email — senza saperlo.
Meccanismo dell’attacco
La struttura tipica della pagina attaccante:
<!-- Pagina attaccante su https://evil.it -->
<style>
iframe {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
opacity: 0.0; /* completamente trasparente */
z-index: 10;
}
.esca {
position: absolute;
top: 200px; left: 300px;
z-index: 1;
/* allineato sotto il pulsante "Conferma" dell'iframe */
}
</style>
<iframe src="https://banca.it/trasferimento?importo=1000&destinatario=evil"></iframe>
<button class="esca">Clicca qui per vincere un premio!</button>
L’utente vede il pulsante “Clicca qui per vincere un premio!” e lo clicca — ma il clic viene catturato dall’iframe trasparente sovrapposto e attiva il pulsante “Conferma” della pagina della banca.
Varianti
Likejacking: induce la vittima a cliccare sul pulsante “Mi piace” di Facebook incorporato in un iframe invisibile su una pagina diversa.
Cursorjacking: sposta visivamente il cursore del mouse dalla posizione reale a una diversa, in modo che l’utente creda di cliccare in un punto ma in realtà clicca altrove.
Tapjacking: variante mobile in cui gli overlay sfruttano i tap su touchscreen.
Multistep clickjacking: sequenza di clic multipli coordinati per completare flussi più complessi (es. cambiare email + confermare il cambio).
Drag-and-drop jacking: l’utente viene ingannato a trascinare testo o file — usato per rubare token o esfiltrare contenuti tramite l’API HTML5 drag-and-drop.
Contromisure lato server
X-Frame-Options (legacy)
Header HTTP che indica al browser se la pagina può essere incorporata in un frame:
X-Frame-Options: DENY → non può essere framed da nessuno
X-Frame-Options: SAMEORIGIN → solo la stessa origine può framearla
X-Frame-Options: ALLOW-FROM https://trusted.it → solo l'origine specificata
ALLOW-FROM non è supportato da tutti i browser moderni (Chrome e Firefox lo ignorano).
frame-ancestors in CSP (moderno)
La direttiva frame-ancestors della Content Security Policy sostituisce X-Frame-Options con piena compatibilità browser e supporto a origini multiple:
Content-Security-Policy: frame-ancestors 'none';
Content-Security-Policy: frame-ancestors 'self';
Content-Security-Policy: frame-ancestors 'self' https://trusted.it;
frame-ancestors 'none' è il valore più restrittivo: nessuna pagina può incorporare la risposta in un frame. Quando entrambi gli header sono presenti, i browser moderni danno precedenza a frame-ancestors.
Frame-busting JavaScript (sconsigliato)
Tecnica legacy che usa JavaScript per rompere il framing:
if (window.top !== window.self) {
window.top.location = window.self.location;
}
È aggirabile con l’attributo sandbox dell’iframe (sandbox="allow-forms" senza allow-scripts blocca il JavaScript del frame) e non è affidabile come difesa.
Clickjacking vs CSRF
Clickjacking e CSRF portano entrambi l’utente a eseguire azioni non intenzionali, ma in modo diverso:
| Clickjacking | CSRF | |
|---|---|---|
| Meccanismo | L’utente clicca fisicamente su un elemento nascosto | Richiesta HTTP forgiata inviata automaticamente |
| Interazione utente | Richiesta | Non richiesta |
| Visibilità | L’utente vede la pagina esca, non l’azione reale | Nessuna visibilità |
| Difesa principale | frame-ancestors / X-Frame-Options | Token CSRF / SameSite cookie |
I token CSRF non proteggono dal clickjacking: se la vittima clicca sull’iframe con il form reale, il token è presente e valido.
Relazione con altri meccanismi
- Content Security Policy —
frame-ancestorsè la difesa raccomandata. - CSRF — attacco correlato, difese diverse.
- Same-Origin Policy — la SOP non impedisce il framing di per sé; serve
frame-ancestors.