Glosario

¿Qué es el clickjacking? Un ataque que te hace pulsar botones de una página transparente superpuesta a otra

El clickjacking superpone tu sitio de forma invisible para que el usuario pulse botones ocultos. Cómo evitarlo con CSP frame-ancestors y X-Frame-Options.

Publicado 2026-06-10 Actualizado 2026-10-06 8 min de lectura
En esta página

El clickjacking te engaña para que pulses un botón de una página oculta bajo la que ves. Aquí tienes cómo funciona y cómo prevenirlo de forma fiable (sin pasos de ataque).

Qué se ataca

Cualquier cosa que sea "un clic, listo, y valioso".

Objetivo probablePor qué
Confirmar una transferencia/compraUn clic mueve dinero
Cambio de configuración (visibilidad, apps conectadas)Prepara un secuestro posterior o el acceso a datos
"Permitir" de OAuth / permisosAprueba en silencio la vinculación de una cuenta
Seguir / me gusta / publicar en redesSe abusa para difusión y granjas de "me gusta"

Por qué funciona

Los navegadores pueden cargar otro sitio en un iframe y apilarlo encima. El atacante hace ese iframe transparente (opacity 0), de modo que el usuario solo ve el señuelo de la interfaz colocado debajo. Cuando el usuario pulsa el "botón falso", el botón real superpuesto justo encima recibe el clic.

Página del atacante: "¡Has ganado un premio, pulsa abajo!"
= un iframe transparente de la página real del banco/configuración, encima
↓ el usuario pulsa el botón señuelo visible
el botón real "Confirmar", justo encima, es lo que realmente se pulsa
↓ bajo el propio inicio de sesión del usuario
la transferencia / el cambio de configuración / el consentimiento se completa como "acción del usuario"
El atacante apila el sitio real de forma invisible; solo el señuelo de la interfaz es visible. El clic va a la página real transparente.

Se parece a CSRF, pero CSRF envía una solicitud por detrás, mientras que el clickjacking hace que el usuario opere la pantalla real: por eso los tokens CSRF por sí solos no lo detienen.

Caso real: el diálogo de permisos de un plugin del navegador (2008)

En octubre de 2008, Adobe publicó un aviso de seguridad (APSA08-08) sobre un problema de clickjacking que afectaba a varios navegadores. Según la prensa, superponiendo de forma invisible el diálogo de configuración de Flash Player, un sitio podía conseguir que el usuario le concediera acceso a la cámara y al micrófono sin darse cuenta. Adobe publicó versiones corregidas de Flash Player y, como solución provisional, recomendó elegir "denegar siempre" en el administrador de configuración.

La lección: los botones de transferencia no son el único objetivo. Cualquier pantalla en la que un solo clic entrega un permiso ("Permitir", "Aceptar", "Conectar") entra en juego. MITRE clasifica esta debilidad como CWE-1021 (Improper Restriction of Rendered UI Layers or Frames).

Defensa: no permitas que otros sitios incrusten el tuyo

1

Configura CSP frame-ancestors (lo más importante)

Añade Content-Security-Policy: frame-ancestors 'self' (solo tu propio origen puede enmarcarte). Si nadie necesita incrustarte, 'none' es lo más seguro. Lista dominios solo para los socios que permitas explícitamente.

2

Añade también X-Frame-Options (retrocompatible)

Para clientes antiguos, envía también X-Frame-Options: DENY (o SAMEORIGIN). Así cubres tanto navegadores antiguos como nuevos.

3

Añade un paso de confirmación en las acciones críticas

Protege las transferencias y las concesiones de permisos tras una reautenticación, un diálogo de confirmación o una comprobación de intención: así es más difícil forzarlas mediante una superposición silenciosa.

4

Marca las cookies de sesión como SameSite

SameSite=Lax/Strict frena el envío automático entre sitios. No resuelve el clickjacking por sí solo, pero debilita la clase más amplia de "acción iniciada desde otro sitio".

X-Frame-Options frente a CSP frame-ancestors

Los dos encabezados impiden que otros sitios incrusten el tuyo, pero difieren en los detalles.

X-Frame-OptionsCSP frame-ancestors
ValoresDENY (bloquear todo) / SAMEORIGIN (solo el mismo origen)'none' / 'self' / una lista de dominios permitidos
Varios sitios autorizados a incrustarNo es posible (ALLOW-FROM no funciona en navegadores modernos)Posible
Configurarlo con etiqueta metaSin efectoSin efecto
Cuando están los dosLo ignoran los navegadores compatiblesTiene prioridad
PapelRespaldo para navegadores antiguosLa defensa principal hoy

Si envías los dos, mantén el mismo significado: combina frame-ancestors 'none' con DENY, y frame-ancestors 'self' con SAMEORIGIN.

Errores de configuración habituales

  • Suponer que default-src de CSP lo cubre. frame-ancestors no hereda de default-src. Incluso con default-src 'none', la incrustación sigue permitida si no escribes frame-ancestors
  • Ponerlo en una etiqueta meta: <meta http-equiv> no tiene efecto aquí, así que envíalo como encabezado de respuesta
  • Dejarlo como Content-Security-Policy-Report-Only: eso solo informa de las infracciones y no bloquea la incrustación. Cambia al encabezado que aplica la política cuando hayas confirmado que funciona
  • Configurarlo solo en algunas páginas: se suele comprobar la portada y se olvidan la página de inicio de sesión, las de configuración o las de error. Comprueba también que un CDN o un proxy no esté eliminando el encabezado

Cómo comprobar tu propio sitio

1

Compruébalo con una herramienta de encabezados

Introduce la URL de tu sitio en el verificador de encabezados de seguridad y mira si se devuelven X-Frame-Options y frame-ancestors de CSP. No revises solo la portada: revisa también las páginas de configuración con sesión iniciada y las de transferencias o concesión de permisos.

2

Compruébalo en las herramientas de desarrollo del navegador

Recarga la página con la pestaña Red abierta y mira los encabezados de la respuesta HTML. Comprueba también que el encabezado no se envíe dos veces ni con valores contradictorios.

3

Configúralo en un solo lugar

Añadirlo a todas las respuestas desde un único punto (el servidor web, como nginx o Caddy, el proxy inverso o el framework) evita tanto los huecos como los duplicados. Si vas a escribir una CSP nueva, el generador de CSP puede montar una que incluya frame-ancestors.

La opinión de este sitio: una línea de encabezado es la corrección más eficaz, así que comprueba primero tu propio sitio

La defensa frente al clickjacking no es código complejo; son una o dos líneas de encabezado de respuesta que bloquean la incrustación. Aplícalas en todo el sitio desde el framework o el proxy inverso (Caddy/nginx) para que nada se cuele. El fallo más común es un encabezado que creías haber puesto pero que en realidad falta, así que, después de configurarlo, confirma con los pasos anteriores que de verdad se devuelve.

Fuentes (primarias)

  • OWASP, "Clickjacking Defense Cheat Sheet" — cheatsheetseries.owasp.org (frame-ancestors, X-Frame-Options, SameSite; ALLOW-FROM ya no funciona; las etiquetas meta no tienen efecto; límites del frame-busting)
  • MDN, "CSP: frame-ancestors" — developer.mozilla.org (valores admitidos, sin herencia de default-src, no admitido en meta)
  • RFC 7034, "HTTP Header Field X-Frame-Options" — rfc-editor.org
  • IPA, "How to Secure Your Web Site, 1.9 Clickjacking" (en japonés) — ipa.go.jp
  • Adobe, "Security Advisory for Flash Player (APSA08-08)" (7 de octubre de 2008) — adobe.com
  • Computerworld, "Clickjackers could hijack webcams, microphones, Adobe warns" (octubre de 2008) — computerworld.com (el objetivo era el diálogo de permisos de cámara y micrófono)
  • MITRE, "CWE-1021: Improper Restriction of Rendered UI Layers or Frames" — cwe.mitre.org

Sigue leyendo

Clasificación

CWE clasifica los tipos de debilidad que causan las vulnerabilidades; MITRE ATT&CK clasifica las técnicas de los atacantes. Ambos los mantiene MITRE y se usan ampliamente para etiquetar vulnerabilidades y reglas de detección.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q¿Qué puede hacer el clickjacking?
A

Un clic que el usuario hace 'a propósito' cae sobre el botón de una página real superpuesta por debajo. Se abusan acciones críticas de un solo clic: transferencias de dinero, cambios de configuración, concesión de permisos, seguir/dar me gusta en redes, botones de consentimiento. No roba una contraseña: hace que el usuario, ya con sesión iniciada, realice la acción.

Q¿Cuál es la principal defensa?
A

Negarse a ser incrustado en el frame de otro sitio. Configura la directiva CSP frame-ancestors a 'self' (o solo a los dominios permitidos) en los encabezados de respuesta, y añade X-Frame-Options: DENY por retrocompatibilidad. Eso elimina la superficie que necesita una superposición.

Q¿Basta con el frame-busting en JavaScript?
A

No. Los viejos scripts de 'salir si estoy en un iframe' tienen muchas formas de eludirse y no ayudan cuando JS está deshabilitado. La defensa fiable son los encabezados del servidor (frame-ancestors / X-Frame-Options) que indican al navegador que rechace la incrustación.

Q¿X-Frame-Options o CSP frame-ancestors: cuál debo usar?
A

Envía ambos con el mismo significado; es la práctica habitual. frame-ancestors puede listar varios sitios autorizados a incrustarte y, cuando están los dos, los navegadores que lo admiten aplican frame-ancestors. X-Frame-Options sirve de respaldo para navegadores antiguos. Combina 'none' con DENY y 'self' con SAMEORIGIN.

Q¿Puedo configurarlo con una etiqueta meta de HTML?
A

No. frame-ancestors no tiene efecto en un elemento meta, y X-Frame-Options en un elemento meta también se ignora. Ambos deben enviarse como encabezados de respuesta HTTP, configurados en el servidor web, el proxy inverso o el framework.

Q¿Y si necesito que mis otros sitios o un socio incrusten páginas?
A

Lista los sitios autorizados en frame-ancestors (por ejemplo, frame-ancestors 'self' https://partner.example). El ALLOW-FROM de X-Frame-Options no funciona en los navegadores modernos, así que no dependas de él para una lista de permitidos. Limita el permiso a las páginas y dominios que de verdad necesitan incrustarse.