¿Puede una web abrir una ventana y esconderla? Investigación

Trabajo de ciberseguridad · la técnica del popunder, probada en Chrome actual, y por qué el navegador la bloquea.

0 · De qué va esto

El objetivo es que una página web, al pulsar un botón, abra otra página sin que el usuario se dé cuenta. Esto tiene nombre propio en seguridad: se llama popunder (una ventana que se abre y queda debajo) o tab-under (una pestaña que se abre a escondidas). Durante años se usó para:

Adelanto del resultado: hoy no se puede esconder una ventana detrás de las demás. Los navegadores lo bloquean a propósito. Abajo se prueba de cuatro formas distintas y se ve qué hace Chrome en cada una. Lo único que sigue funcionando es abrir una pestaña en segundo plano, y aun así queda a la vista en la barra de pestañas. Pulsa los botones y compruébalo tú mismo.

1 · La página, tal como la ve el visitante

Un botón normal y corriente. Al pulsarlo se abre la página oculta sin que se vea nada.

2 · Panel de comprobación (para el profesor)

La ventana oculta avisa a esta página en cuanto se abre, así queda demostrado que se abrió aunque no se vea. Y aparece en la barra de tareas, para comprobarlo con los ojos.

Esperando a que pulses el botón…

El botón principal usa el método A, que es el único que sale bien siempre: abre una pestaña de fondo, no se ve nada en pantalla y aparece en la barra de pestañas y en la de tareas. Los otros tres botones son los intentos de hacerlo con una ventana, y la página te dice en cada caso qué ha pasado de verdad. Ojo con el método D: se lleva esta ventana a la página oculta.

3 · Cómo funciona (los tres métodos)

MétodoQué haceDónde funciona
A · clic con Ctrl simulado Crea un enlace invisible y le manda un clic con la tecla Ctrl (Cmd en Mac) pulsada. El navegador lo trata como "abrir en pestaña nueva de fondo". Chrome, Edge, Opera, Brave. Es el que funciona hoy.
B · window.open + blur Abre una ventana y la manda al fondo con blur(). Antiguo. Casi todos los navegadores lo ignoran o lo bloquean.
C · ventana calcada detrás Abre la página oculta en una ventana nueva colocada en la misma posición y tamaño que la actual, con la idea de que quede tapada. No funciona. Chrome le da el frente a la ventana nueva igualmente. Se deja para enseñar el intento fallido.
D · intercambio de ventanas No pelea con el navegador: acepta que la ventana nueva se pondrá delante y le da una copia de la página actual. La ventana vieja, que se queda detrás, es la que carga la página oculta. Es el que usa el botón principal. Chrome, Edge, Opera, Brave. El único que consigue dejar una ventana detrás.

Método A, que es el que usa el botón:

function abrirPestanaOculta(url) {
  // 1. Enlace invisible que apunta a la página que queremos abrir
  var a = document.createElement('a');
  a.href = url;
  a.target = '_blank';
  a.rel = 'noopener';
  document.body.appendChild(a);

  // 2. Le mandamos un clic CON CTRL PULSADO (Cmd si es un Mac).
  //    Para el navegador eso significa "abrir en pestaña nueva, pero de fondo".
  var esMac = /Mac|iPhone|iPad/i.test(navigator.platform || navigator.userAgent);
  a.dispatchEvent(new MouseEvent('click', {
    bubbles: true, cancelable: true, view: window,
    ctrlKey: !esMac, metaKey: esMac, button: 0
  }));

  a.remove();
}

Método D, el del botón principal:

function intercambioDeVentanas() {
  // Chrome SIEMPRE pone delante la ventana que se acaba de abrir.
  // No se puede evitar. Asi que no peleamos: le damos la vuelta al problema.

  var x  = window.screenX,    y  = window.screenY;
  var an = window.outerWidth, al = window.outerHeight;

  // 1. La ventana NUEVA (la que se pondra delante) se lleva una COPIA
  //    de esta misma pagina, del mismo tamano y en el mismo sitio.
  //    El visitante ve exactamente lo mismo que antes: no nota nada.
  window.open(location.href, '_blank',
              'width=' + an + ',height=' + al + ',left=' + x + ',top=' + y);

  // 2. Y ESTA ventana, que se queda detras, es la que se va a la
  //    pagina que queriamos abrir a escondidas.
  location.replace('pagina-oculta.html');
}

Este es el truco de verdad, y la lección del ejercicio: cuando el navegador no te deja hacer algo, no insistas — cambia de sitio las piezas. No se puede mandar una ventana al fondo, pero sí se puede decidir qué contenido se queda en la ventana que ya estaba detrás.

Método C (el intento que NO funciona, para comparar):

function ventanaDetras() {
  // 1. Miramos DONDE esta y QUE TAMANO tiene la ventana actual.
  var x  = window.screenX,    y  = window.screenY;
  var an = window.outerWidth, al = window.outerHeight;

  // 2. Abrimos la pagina oculta en una ventana nueva con esa misma
  //    posicion y ese mismo tamano: queda calcada justo detras.
  var oculta = window.open('pagina-oculta.html', 'ventanaAlFondo',
               'width=' + an + ',height=' + al + ',left=' + x + ',top=' + y);

  // 3. Por si el navegador ignoro la posicion, se la repetimos.
  //    Sobre esta ventana SI se puede: la ha abierto el propio codigo.
  oculta.moveTo(x, y);
  oculta.resizeTo(an, al);

  // 4. Y por si acaso le diera el frente, la mandamos al fondo.
  oculta.blur();
  window.focus();
}

Este intento parte de una idea falsa: que la ventana nueva se quedaría donde la pusieras. No es así — Chrome se la lleva al frente igualmente. Pulsa el botón "Método C · ventana calcada" del panel y lo verás: la página lo detecta y avisa de que se puso delante.

La gracia del método A está en que no intentamos robar el foco (eso lo bloquean todos los navegadores). Le pedimos al navegador algo que él ya sabe hacer: abrir una pestaña de fondo, igual que cuando tú haces Ctrl+clic en un enlace. Solo funciona si sale de un clic real del usuario.

4 · La conclusión del ejercicio

Ninguna página web puede dejar una ventana por detrás de las demás. Se probó de tres formas distintas y en las tres Chrome puso la ventana nueva delante:

Es una protección deliberada de los navegadores: se abusó de esta técnica para publicidad y engaños, y desde entonces la web ya no decide qué ventana está delante. Lo máximo que se puede hacer sin que el visitante vea nada es abrir una pestaña en segundo plano (método A), y aun así queda a la vista en la barra de pestañas y en la barra de tareas.

Otros límites

5 · Por qué el navegador lo impide (con fuentes)

El bloqueo no es casualidad: son cuatro decisiones tomadas a propósito y documentadas.

Y la comunidad lo dio por muerto: la librería más conocida para hacer popunders (js-popunder) está abandonada desde 2015. Su autor lo dejó, harto —en sus palabras— del «juego del gato y el ratón con Google», y su propia documentación admite que el truco «no funciona en Chrome 41+». — Fuente 9.

Fuentes consultadas

  1. MDN Web Docs — Window: blur() method
  2. WHATWG HTML — Issue #7441: Should we remove window.blur?
  3. Chromium blink-dev — Intent to Implement: Block Tab-Unders
  4. Chrome Platform Status — Block tab-under navigations
  5. Google Chrome — Bloquear o permitir pop-ups en Chrome
  6. OWASP — Reverse Tabnabbing
  7. OWASP WSTG — Testing for Reverse Tabnabbing (WSTG-CLNT-14)
  8. PortSwigger — Chrome update will eradicate reverse tabnabbing attacks
  9. GitHub — js-popunder (librería abandonada, última versión 2015)

Pruebas realizadas en Google Chrome sobre Windows 10 el 26/08/2026. La versión exacta del navegador se consulta en chrome://version y conviene anotarla al reproducir el trabajo.