¿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:
- Fraude de publicidad: cada página oculta que se carga cuenta como una visita que se cobra.
- Malware: la ventana escondida descarga algo mientras el usuario mira otra cosa.
- Phishing: una falsa pantalla de login que el usuario encuentra después y no recuerda haber abierto.
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.
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étodo | Qué hace | Dó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:
- Método B (
blur()+focus()): el navegador ignora las dos órdenes. - Método C (colocarla calcada detrás): se abre en el sitio correcto, pero al frente igual.
- Método D (intercambio): sí deja contenido detrás, pero no abriendo una ventana nueva — lo que hace es quedarse con la ventana que ya tenías, y eso se nota.
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
- Tiene que salir de un clic real. Si se lanza solo al cargar la página, el navegador lo bloquea.
- Firefox y Safari suelen ignorar el clic simulado con Ctrl: ahí cae al método B, y el método B casi siempre se ve. La página lo detecta y lo dice.
- No es invisible del todo, ni puede serlo: la pestaña o la ventana aparecen siempre en la barra de tareas. Los navegadores no permiten nada más oculto que esto.
- Ninguna web puede mandar una ventana al fondo. Es una protección de los navegadores contra este mismo truco. Por eso el método C falla y el D funciona: el D no lo intenta siquiera.
- El método D tiene una pista que lo delata: la ventana de delante es una emergente, sin barra de pestañas ni de marcadores. El contenido es idéntico, pero el marco cambia.
- Queda detrás de la ventana del navegador, no debajo de todos los programas de Windows. Eso ninguna web lo puede hacer.
- Los bloqueadores de anuncios (uBlock, AdGuard) detectan y cortan esta técnica, porque es la que usa la publicidad agresiva.
- Uso real: abrir cosas sin que el visitante se entere está considerado mala práctica; en la memoria conviene presentarlo como demostración técnica, no como algo para una web de verdad.
5 · Por qué el navegador lo impide (con fuentes)
El bloqueo no es casualidad: son cuatro decisiones tomadas a propósito y documentadas.
window.blur()se dejó vacío. La documentación oficial dice que el método no hace nada; la especificación recomienda ignorarlo. Se hizo por el abuso de sitios hostiles. — Fuentes 1 y 2.- Hace falta un clic real. Sin una interacción del usuario, Chrome corta
window.open(). Así se impide la apertura automática, que era lo más rentable. — Fuente 5. - Bloqueo de tab-unders. Chrome detecta el patrón del método D (abrir pestaña y redirigir la original) y lo bloquea, citando el abuso publicitario. — Fuentes 3 y 4.
noopenerpor defecto desde Chrome 88 (2021). Corta el reverse tabnabbing, un ataque emparentado catalogado por OWASP. — Fuentes 6, 7 y 8.
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
- MDN Web Docs — Window: blur() method
- WHATWG HTML — Issue #7441: Should we remove window.blur?
- Chromium blink-dev — Intent to Implement: Block Tab-Unders
- Chrome Platform Status — Block tab-under navigations
- Google Chrome — Bloquear o permitir pop-ups en Chrome
- OWASP — Reverse Tabnabbing
- OWASP WSTG — Testing for Reverse Tabnabbing (WSTG-CLNT-14)
- PortSwigger — Chrome update will eradicate reverse tabnabbing attacks
- 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.