Enciendes la VPN, eliges un servidor en Ámsterdam y cargas una página. Tu dirección IP figura como holandesa en todos los sitios de comprobación de IP que pruebas. Y aun así, el proceso de pago añade un paso extra de verificación, el catálogo de streaming sigue siendo el equivocado, o un inicio de sesión dispara un correo de «nuevo dispositivo». Lo que te delató cabe en una línea de JavaScript: Intl.DateTimeFormat().resolvedOptions().timeZone.
Esa llamada devuelve la zona horaria que tiene configurada tu sistema operativo, y la VPN no tiene influencia alguna sobre ella. Tus paquetes ahora salen de Ámsterdam; tu navegador sigue reportando, tan campante, America/New_York. El widget de esta página ejecuta la misma comparación que haría un script antifraude: consulta la zona horaria que implica tu dirección IP, lee la que reporta tu navegador y comprueba si las dos coinciden.
Dos respuestas a una misma pregunta
La primera respuesta viene de la red. Un sitio web ve la IP desde la que te conectas y la busca en una base de datos de geolocalización: ipinfo.io, MaxMind y sus competidores devuelven todos una zona horaria junto con la ubicación. Con la VPN activada, esa respuesta apunta al servidor de salida: conéctate a través de Ámsterdam y la base de datos dirá Europe/Amsterdam. Cómo se construyen esas bases de datos, y cuánto pueden equivocarse con tu dirección postal, es una historia que contamos en nuestro artículo sobre geolocalización de IP. Pero, a escala de zona horaria, casi nunca fallan.
La segunda respuesta viene de tu sistema operativo. JavaScript puede leer el desfase local respecto a UTC desde los años noventa mediante new Date().getTimezoneOffset(), y los navegadores modernos entregan el nombre completo de la zona IANA a través de la API Intl. Sin diálogo de permisos, sin gesto del usuario, sin rastro en ningún panel de privacidad. Se trata como un metadato corriente, la misma clase de cosa que el tamaño de tu pantalla.
198.51.100.7 base de datos geo Europe/AmsterdamIntl.DateTimeFormat() America/New_YorkEurope/Amsterdam ≠ America/New_York —
detectado con una simple comparación de cadenas, antes de que hayas hecho clic en nada.Comparar las dos es gratis, así que lo hace todo el que tiene un motivo: la puntuación de fraude en pagos, el control de regiones del streaming, los filtros de fraude publicitario, los sistemas de seguridad de cuentas y las pilas anti-bot que ya ejecutan una docena de comprobaciones de consistencia más.
Por qué la VPN no puede arreglarlo
Una VPN cifra tu tráfico y sustituye la dirección IP que ven los servidores. Ese es todo su cometido. Tu zona horaria nunca viaja por el túnel porque, sencillamente, nunca viaja. Vive en los ajustes de tu sistema operativo, y el navegador la lee en local y se la reporta a cualquier script que pregunte.
El sitio no averigua la hora de tu reloj; averigua el identificador de la zona. America/New_York es una afirmación de ubicación, precisa hasta una franja vertical del planeta, y está a plena vista junto a navigator.language y la cabecera Accept-Language, que hacen el mismo tipo de afirmación sobre dónde vives.
Seamos justos: una discrepancia no demuestra nada por sí sola. La gente viaja con portátiles que todavía se creen en casa, y quien trabaja en remoto mantiene a propósito la zona horaria de su equipo de trabajo. Los sistemas de detección lo saben, y por eso la discrepancia alimenta una puntuación de riesgo en lugar de disparar un bloqueo. Pero las puntuaciones se acumulan: una discrepancia de zona horaria más una IP de centro de datos más una fuga de WebRTC ya no es ambigua, y cada señal hace que la siguiente cuente más.
La trampa de la falsificación a medias
El arreglo obvio es mentir también sobre la zona horaria, y hay un montón de extensiones que ofrecen exactamente eso. La mayoría sobrescribe Intl.DateTimeFormat para que resolvedOptions().timeZone devuelva lo que tú configures. El problema es que tu navegador anuncia su zona horaria en más de un sitio:
new Date().getTimezoneOffset()reporta cuántos minutos va tu reloj por detrás de UTC, desde una ruta de código completamente distinta.Date.prototype.toString()escribe el nombre de la zona con todas sus letras: «GMT-0400 (Eastern Daylight Time)».- Formatear una fecha de cualquier día del año expone tus reglas de horario de verano, que forman parte de la identidad de la zona.
Un desfase fijo no es una zona horaria. Ámsterdam está en UTC+2 en julio pero en UTC+1 en enero, y cambia en fechas distintas a las de Nueva York: la UE mueve los relojes el último domingo de marzo; Estados Unidos, dos o tres semanas antes. Un script puede preguntar cuál era tu desfase el uno de enero y el uno de julio y comprobar si el par encaja con la zona que afirmas tener. Una falsificación que fija un único desfase para todo el año no encaja con ningún lugar que cambie de hora, y desde luego no con la Ámsterdam que dice ser.
Descuida cualquiera de estos frentes y el navegador empieza a discutir consigo mismo:
Europe/Amsterdam America/New_York UTC−4 Esta trampa tiene una segunda capa. Un Intl.DateTimeFormat sobrescrito deja de parecer nativo cuando un script inspecciona su código fuente. Es el mismo delator de funciones parcheadas que expone a los plugins de sigilo, el que recorrimos en el artículo sobre detección de bots. Una discrepancia limpia dice «probablemente una VPN». Una API parcheada dice «esta persona está manipulando activamente el navegador», y todo sistema de puntuación serio se lo cobra más caro.
Qué hacer en la práctica
- Prueba antes de confiar. El widget de esta página compara ahora mismo la zona horaria de tu navegador con la de tu IP, y el análisis completo del navegador lo ejecuta junto a las comprobaciones de WebRTC, plataforma y fingerprint. Ejecútalo con la VPN activada. Si el widget te marca, también lo hará cada script antifraude.
- Mueve tu reloj con tu VPN. El arreglo aburrido es el sólido: pon la zona horaria de tu sistema operativo en la ciudad de salida antes de conectarte. No hay nada que detectar, porque nada es falso: todas las API reportan la misma zona desde la misma fuente. La alternativa del mundillo de la privacidad es Tor Browser, que reporta UTC para todo el mundo; tu zona real queda oculta, al precio de parecer exactamente Tor Browser.
- Si gestionas varias identidades, deja de hacer esto a mano. Administrar cuentas en varias regiones significa que cada perfil necesita su propia IP, zona horaria, idioma y fingerprint, todos de acuerdo entre sí, en cada sesión. Esa contabilidad es la que automatizan los navegadores anti-detección: Incogniton deriva la zona horaria de cada perfil de su IP de proxy, de modo que las dos respuestas de este artículo, de entrada, nunca llegan a discrepar.
La comprobación de zona horaria es la verificación cruzada de geolocalización más barata que puede ejecutar un script, y exactamente por eso está en todas partes. Treinta segundos con el widget de arriba te dicen de qué lado estás.