Comprobador de iframes

Comprobador de iframe online gratuito: ingresa la URL de cualquier página para inspeccionar sus encabezados X-Frame-Options y Content-Security-Policy (frame-ancestors), determina si la página puede incrustarse en un iframe y valida el resultado con una vista previa en tiempo real. El historial se mantiene solo durante la sesión actual del navegador.

Comprobación de inserción en IFrame

:

Procesa cada línea con la misma validación de encabezados y la agrega al historial de sesión inferior. Límite de 20 URL por lote; se procesan de a pocas a la vez para respetar la carga de los sitios destino.

Comprobadas:: /
URL Resultado HTTP

Vista previa en tiempo real

La inspección de encabezados es un paso rápido inicial, pero no detecta técnicas de ruptura de marcos (frame-busting) con JavaScript: si los encabezados indican «Incrustable» pero la vista previa permanece en blanco, salta fuera del marco o muestra una página de error, la página no es segura para incrustar. La vista previa en tiempo real es la referencia definitiva.

Historial (esta sesión)

Guardado únicamente en esta pestaña (sessionStorage); se borra al cerrarla. No se envía ningún dato al servidor.

No hay comprobaciones realizadas en esta sesión.

Cómo funciona la comprobación

  1. Ingresa la URL destino y haz clic en Comprobar. El servidor obtiene la página simulando una solicitud real de iframe (con Sec-Fetch-Dest: iframe) y lee sus encabezados de respuesta.
  2. La conclusión se basa en X-Frame-Options (DENY / SAMEORIGIN bloquean la incrustación) y Content-Security-Policy frame-ancestors (solo * o un comodín de protocolo permiten padres externos genéricos).
  3. La misma URL se carga en el iframe de vista previa en tiempo real para que puedas confirmar el comportamiento real del navegador, incluidas las técnicas de frame-busting por JavaScript que los encabezados no pueden revelar.

¿Qué determina si una página puede incrustarse?

La capacidad de mostrar una página web dentro de un `<iframe>` en otro sitio la determina el navegador, según los encabezados de respuesta que envíe la propia página. Este comprobador realiza la misma inspección en el servidor y proporciona un resultado inmediato.

`X-Frame-Options` es el encabezado clásico: `DENY` prohíbe la incrustación en todas las páginas, `SAMEORIGIN` solo permite que sitios del mismo origen la incrusten, y `ALLOW-FROM` fue descontinuado en los navegadores modernos. Si falta este encabezado, las reglas antiguas no bloquean la incrustación.

`frame-ancestors` de `Content-Security-Policy` es su sucesor moderno. Indica los orígenes autorizados para incrustar la página, por ejemplo: `frame-ancestors 'self' https://example.com`. Un valor de `*` (o un protocolo simple como `https:`) acepta cualquier contenedor HTTPS; cualquier restricción adicional bloqueará la incrustación por parte de terceros.

Los encabezados no lo cuentan todo: los scripts de la página pueden ejecutar código anti-incrustación (como comparar `top !== self` y forzar una navegación de nivel superior). Además, las páginas de inicio de sesión o los recursos con restricciones geográficas pueden responder distinto a peticiones procedentes de centros de datos. Por ello, cada resultado incluye una vista previa en tiempo real.

Guía rápida: configuración de encabezados de respuesta

Si eres el propietario del sitio, controla su incrustación directamente mediante los encabezados de respuesta.

Bloquear la incrustación desde cualquier página

X-Frame-Options: DENY Content-Security-Policy: frame-ancestors 'none'

Los navegadores rechazan representar la página dentro de cualquier `<iframe>`, ofreciendo la protección contra clickjacking más estricta.

Permitir únicamente incrustaciones desde el mismo origen

X-Frame-Options: SAMEORIGIN Content-Security-Policy: frame-ancestors 'self'

Solo las páginas que compartan mismo esquema, host y puerto podrán incrustarla; los sitios de terceros quedarán bloqueados.

Permitir únicamente orígenes específicos

Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com

Incluye los orígenes confiables en `frame-ancestors`; aquellos que no se listan serán bloqueados.

Permitir incrustación desde cualquier página

No configurar el encabezado X-Frame-Options Content-Security-Policy: frame-ancestors *

Cualquier sitio podrá incrustar la página en un `<iframe>`. Valora los riesgos de seguridad implicados.

Nota: `frame-ancestors` de CSP ha sustituido a `X-Frame-Options`. Si ambos están presentes, prevalece CSP; se recomienda usar `frame-ancestors`.

¿Cómo detecta el servidor que una solicitud proviene de un iframe?

Desde aproximadamente 2020, los navegadores basados en Chromium y Firefox añaden automáticamente un conjunto de encabezados Fetch Metadata a cada navegación y petición de subrecurso. El más relevante para verificar la incrustación es `Sec-Fetch-Dest`, ya que informa al servidor sobre el contexto de la petición sin requerir cooperación por parte de la página solicitante.

  • `Sec-Fetch-Dest: document` — navegación de nivel superior, fuera de cualquier marco.
  • `Sec-Fetch-Dest: iframe` — la petición se carga dentro de un elemento `<iframe>`.
  • `Sec-Fetch-Dest: frame` — carga dentro de un `<frame>` (frameset) heredado.
  • `Sec-Fetch-Dest: embed / object` — carga dentro de un elemento `<embed>` o `<object>`.

Este comprobador envía su propia sonda con `Sec-Fetch-Dest: iframe`, imitando exactamente lo que envía un navegador real al incrustar una página; por lo tanto, el resultado refleja cómo se comporta realmente el servidor de destino ante solicitudes genuinas de `iframe`, y no solo ante un `fetch` genérico.

`Sec-Fetch-Dest` es una señal útil, pero no constituye un límite de seguridad: solo es enviada por navegadores modernos, y los clientes ajenos al navegador (`curl`, bots, ciertas `webview` y navegadores antiguos) pueden omitirlo por completo o enviar un valor arbitrario. Un servidor podría usarlo para registrar actividad o aplicar límites de frecuencia, pero nunca debe depender únicamente de él para determinar si el incrustamiento en un marco (`framing`) es seguro; esa decisión corresponde a `X-Frame-Options` y `CSP frame-ancestors`, que los navegadores hacen cumplir de manera independiente a las cabeceras de la solicitud.

En el lado del cliente, una página también puede detectar que se está ejecutando dentro de un marco sin necesidad de ninguna cabecera, por ejemplo, comparando `window.top !== window.self` (o leyendo `window.frameElement` para marcos del mismo origen), y luego reaccionar: mostrar una advertencia o forzar una redirección a nivel superior (`top-level`). Esta es la técnica `frame-busting` mencionada anteriormente, y funciona independientemente de lo que indiquen las cabeceras de la solicitud.

Ejemplos de configuración del servidor: bloqueo de incrustación en iframe

Los siguientes ejemplos muestran cómo configurar cada servidor o framework para bloquear por completo la incrustación en `<iframe>` (X-Frame-Options: DENY + CSP `frame-ancestors 'none'`), que representa la opción más estricta de la guía rápida anterior.

server {
    location / {
        add_header X-Frame-Options "DENY" always;
        add_header Content-Security-Policy "frame-ancestors 'none'" always;
    }
}
<IfModule mod_headers.c>
    Header always set X-Frame-Options "DENY"
    Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
app.use((req, res, next) => {
  res.setHeader('X-Frame-Options', 'DENY');
  res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
  next();
});
// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: '/:path*',
        headers: [
          { key: 'X-Frame-Options', value: 'DENY' },
          { key: 'Content-Security-Policy', value: "frame-ancestors 'none'" },
        ],
      },
    ];
  },
};
class SetFrameOptions
{
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);
        $response->headers->set('X-Frame-Options', 'DENY');
        $response->headers->set('Content-Security-Policy', "frame-ancestors 'none'");

        return $response;
    }
}
export default {
  async fetch(request) {
    const response = await fetch(request);
    const headers = new Headers(response.headers);
    headers.set('X-Frame-Options', 'DENY');
    headers.set('Content-Security-Policy', "frame-ancestors 'none'");
    return new Response(response.body, { status: response.status, headers });
  },
};

¿Necesitas permitir únicamente tu propio sitio o una lista breve de permitidos para incrustar la página, en lugar de bloquearlo todo? Sustituye `DENY` por `SAMEORIGIN`, y `'none'` por `'self'` o una lista explícita de orígenes; el resto de la configuración se mantiene igual.

Limitaciones conocidas por plataforma

Además de las reglas generales sobre cabeceras, algunas plataformas muy conocidas presentan particularidades propias; es importante conocerlas antes de dar por hecho que algo está «bloqueado» o es «incrustable» solo con base en las cabeceras.

Plataforma / escenario Comportamiento Motivo
Página de reproducción de YouTube (youtube.com/watch) Bloqueado Utiliza la URL oficial del reproductor `youtube.com/embed/{id}`; la página de reproducción normal envía una política de incrustación restrictiva.
Página de lugar en Google Maps Bloqueado Solo la URL del iframe de Maps Embed API (`google.com/maps/embed`) está diseñada para ser incrustada.
Páginas de inicio de sesión OAuth de Google / Microsoft Bloqueado Bloqueadas deliberadamente desde 2015 para evitar phishing de credenciales dentro de iframes; el flujo de inicio de sesión debe ejecutarse en una ventana principal o emergente.
Páginas de cobro y pago (Stripe Checkout, PayPal, la mayoría de pasarelas bancarias) Bloqueado Incrustar un formulario de pago en un marco es un vector clásico de clickjacking, por lo que los procesadores lo rechazan directamente.
Páginas de repositorios y archivos en GitHub Bloqueado Configuración global `frame-ancestors 'none'`; usa la API REST/GraphQL o una captura de pantalla en lugar de un iframe.
Páginas «Publicar en la web» de Notion / Google Docs Incrustable Están explícitamente diseñadas para ser incrustadas y el producto ofrece código de integración listo para usar.
Artículos de Wikipedia Incrustable No incluyen restricciones de `X-Frame-Options`/`CSP` de forma predeterminada, pero revisa los términos de licencia y atribución antes de incrustarlos a gran escala.

Casos de uso comunes

  • Determina si un componente de terceros, panel de control o documento puede integrarse en tu producto antes de comenzar a desarrollar el código de integración.
  • Verifica que tu propio sitio envíe la política de `X-Frame-Options` o `CSP frame-ancestors` que habías configurado.
  • Soluciona problemas con la protección contra clickjacking: comprende por qué una página muestra `about:blank` o un mensaje de rechazo dentro de un iframe.
  • Revisa por lotes las URLs candidatas durante la agregación de contenido o la integración de portales; usa el historial de la sesión para rehacer las consultas.
  • Prepárate para revisiones de seguridad o pruebas de penetración documentando la política de incrustación (`iframe`) de las dependencias externas.

Preguntas frecuentes

¿Por qué una página marcada como "Embeddable" aparece en blanco en la vista previa?
Los encabezados de respuesta permiten que la página se incruste, pero probablemente contiene scripts anti-iframe, requiere iniciar sesión o aceptar cookies, o muestra contenido distinto según el usuario. Fíate de lo que muestra la vista previa.
¿Puedo ignorar las cabeceras `X-Frame-Options` o `CSP`?
No. El navegador aplica estas cabeceras por motivos de seguridad (protección contra clickjacking); las soluciones alternativas del lado del cliente no son fiables. Para incrustar contenido que no controlas, solicita al propietario del sitio que añada tu origen a la lista permitida en `frame-ancestors`, o utiliza la solución oficial de incrustación o API que proporcione.
¿Cuál es la diferencia entre `DENY` y `SAMEORIGIN`?
`DENY` bloquea la página en cualquier iframe, incluidas las páginas del mismo origen; `SAMEORIGIN` solo permite que se incruste si proviene de un mismo protocolo, host y puerto.
¿Guarda la herramienta las URLs que consulto?
El historial se almacena exclusivamente en la pestaña de tu navegador mediante `sessionStorage` y se elimina al cerrarla. Nuestro servidor solo consulta la URL indicada para leer sus encabezados de respuesta.
¿Por qué una misma URL devuelve resultados distintos en ocasiones distintas?
Los servidores pueden enviar encabezados distintos según la ruta, tras redirecciones, dependiendo del `User-Agent`, o bien aplicar reglas A/B o del WAF. Vuelve a ejecutar la comprobación para actualizar el estado.