Haz pasar tu tráfico por Ámsterdam y Google te saluda en neerlandés. Casi todo el que usa una VPN se ha topado con esta molestia y la ha despachado como una rareza de la VPN. No es una rareza. Es la fuga de la que trata este artículo, funcionando en sentido inverso.
La petición se contradecía a sí misma. Los paquetes venían de una IP holandesa; las cabeceras decían qué idiomas lees en realidad: Accept-Language: en-US,en;q=0.9. Para elegir el idioma de la interfaz, Google se fía de la IP. Un script antifraude en una página de pago ejecuta la comparación idéntica en sentido contrario: comprueba si los idiomas encajan con la IP y archiva la respuesta en tu puntuación de riesgo. El widget de esta página ejecuta esa misma comprobación contra tu navegador, ahora mismo.
Accept-Language: una cabecera en cada petición
Cuando tu navegador le pide algo a un servidor, una página, una imagen, una fuente, adjunta la cabecera HTTP Accept-Language. La cabecera existe para que los servidores puedan elegir un idioma que entiendas, y se construye a partir de la lista de idiomas de los ajustes de tu navegador, que quedó fijada por la configuración regional de tu sistema operativo cuando se instaló el navegador. La notación q=0.9 ordena la lista por preferencia: este navegador prefiere inglés americano, con el inglés a secas como segunda opción muy cercana. La gramática completa está en la página de MDN sobre Accept-Language.
Esa cabecera va en la primerísima petición que envías. No después de que cargue algún script, no después de que se guarde una cookie. El servidor la lee a la vez que la dirección IP de origen del paquete:
198.51.100.7 base de datos geo Ámsterdam, NLGET /checkout HTTP/1.1 Host: shop.example User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Accept-Language: en-US,en;q=0.9 ◄ la lista de idiomas del propio navegador
JavaScript obtiene la misma información a través de navigator.language, y la lista completa mediante navigator.languages, sin diálogo de permisos de por medio. Fíjate en la diferencia con el reloj: un script tiene que ejecutarse y preguntar por tu zona horaria; tu idioma llega antes de que la página tenga ningún script que ejecutar.
Por qué una VPN no cambia el idioma de tu navegador
Una VPN no hace absolutamente nada al respecto. El túnel transporta tus paquetes; no los traduce. Lo que tu navegador escribió se entrega tal cual, incluida la cabecera que dice «mi usuario lee inglés, no neerlandés». Y reescribirla ni siquiera está sobre la mesa: en cualquier sitio HTTPS, la cabecera viaja dentro de la sesión TLS entre tu navegador y el sitio, que la VPN no puede abrir.
Qué demuestra una discrepancia, y qué no
El idioma es una señal blanda, más blanda que la zona horaria. El inglés es lo más parecido que tiene un sistema operativo a un ajuste de fábrica, así que un en-US desde una IP de Ámsterdam, por sí solo, no sorprende a nadie. Bélgica funciona con tres idiomas oficiales; Suiza, con cuatro. Los expatriados y quienes trabajan en remoto leen, con toda legitimidad, un idioma distinto al de sus vecinos. Todo sistema de detección serio sabe todo esto, y por eso una discrepancia de idioma empuja un poco la puntuación y nada más.
Pero la señal tiene una dirección afilada. Un navegador que prefiere pt-BR detrás de una IP de salida holandesa no es ambiguo como lo es el inglés: dice que la persona al teclado lee portugués de Brasil, y en los Países Bajos no faltan direcciones IP, pero sí escasean los hogares donde el portugués es el primer idioma. Súmale una IP de centro de datos y un reloj que sigue en America/Sao_Paulo, y los paquetes que afirman venir de Ámsterdam han perdido la discusión:
nl-NL, nl+ IP de Ámsterdamconcuerda El par cuenta una sola historia. Nada que puntuar.en-US, en+ IP de Ámsterdamambiguo Navegadores en inglés hay en todas partes. Una señal débil por sí sola, pero cuenta cuando se le suman otras.pt-BR, pt+ IP de Ámsterdamdiscrepancia El navegador apunta a Brasil mientras los paquetes afirman venir de los Países Bajos. Ahora ya eres interesante.- cabecera:
nl-NL+ JavaScript:pt-BRfalseo detectado El navegador se contradice a sí mismo, y casi nada salvo la manipulación deliberada hace eso.
Hay un segundo coste, más silencioso. La composición exacta de tu lista, qué idiomas, en qué orden, con qué valores de q, es material de fingerprint. El estudio Panopticlick de la EFF midió en las cabeceras Accept alrededor de seis bits de información identificativa, que es lo que hace funcionar el fingerprinting por Accept-Language: en-US,en;q=0.9 se esconde entre la multitud; nl-BE,fr-BE;q=0.9,en;q=0.8,de;q=0.7 es prácticamente una firma. En comparación, tu lista de fuentes filtra más del doble de bits, pero un script tiene que medirla, mientras que esta cabecera se ofrece sola en cada petición.
Los fabricantes de navegadores lo saben. Safari envía solo tu idioma principal exactamente por este motivo, los ingenieros de Chrome tienen una propuesta para recortar la cabecera a un solo idioma y Brave difumina deliberadamente su respuesta según el sitio. Nada de eso ayuda con la discrepancia, eso sí: el único idioma que sobrevive al recorte sigue siendo el tuyo.
Por qué Google te sale en otro idioma con la VPN puesta
Volvamos al Google en neerlandés. Si los navegadores anuncian educadamente su idioma en cada petición, ¿por qué los sitios lo ignoran en cuanto te conectas por VPN? Porque se fían más de la geolocalización por IP, y lo hacen desde mucho antes de que tuvieras una VPN. Google lo dijo en voz alta en un anuncio de 2017, cuando dejó de ligar sus versiones por país a dominios como google.nl y empezó a servir lo que implicara la ubicación detectada. La cabecera expresa una preferencia; la IP se trata como un hecho. La misma jerarquía que te fastidia en la portada de Google es la que aplica un sistema antifraude cuando tu cabecera y tu IP no se ponen de acuerdo: gana la IP, y tu cabecera queda degradada de preferencia a prueba.
Si tu problema real es la molestia, el arreglo vive en los ajustes de tu cuenta, no en los de tu VPN: las preferencias de idioma con la sesión iniciada suelen imponerse a las conjeturas por IP en Google y en la mayoría de los sitios grandes. La fuga, en cambio, no tiene arreglo en ninguna página de ajustes, porque la fuga es la propia cabecera.
La trampa de la falsificación a medias, otra vez
Quien haya leído el artículo de la zona horaria ya conoce esta trampa. Aquí tiene la misma forma y es más fácil caer en ella: el idioma existe en dos sitios, la cabecera Accept-Language en la red y navigator.languages en el motor de JavaScript. En un navegador normal son dos vistas del mismo ajuste y siempre coinciden. Las herramientas que falsifican una tienden a olvidarse de la otra.
Las extensiones de falseo sobrescriben principalmente el lado JavaScript, porque es lo que una extensión alcanza con facilidad; tu cabecera sigue contándole la verdad a todos los servidores. Los proxies que reescriben cabeceras hacen justo lo contrario y dejan que navigator.languages reporte tu lista real a cualquier script que pregunte. En ambos casos el navegador pasa a discutir consigo mismo, y esa contradicción vale más para un sistema de detección que la discrepancia original, porque los usuarios corrientes de VPN producen discrepancias todo el día mientras que solo la manipulación deliberada produce contradicciones. Encima, un getter de navigator.languages sobrescrito deja de reportar [native code] cuando un script lee su código fuente, el delator al que nuestro artículo sobre detección de bots dedica una sección entera.
La única falsificación que funciona a escala es la aburrida: en su configuración por defecto en inglés, Tor Browser responde en-US,en;q=0.5 para todo el mundo, lo que oculta tu idioma haciéndote idéntico a cualquier otro usuario de Tor. Ese trueque, protección a cambio de ser obviamente Tor, es la versión honesta de lo que las extensiones a medias fingen ofrecer.
Qué hacer en la práctica
- Ejecuta la comprobación. El widget de esta página compara ahora mismo los idiomas de tu navegador con el país de tu IP, usando las mismas correspondencias entre país e idioma que usaría un script antifraude. Hazlo con la VPN activada, porque esa es la configuración con la que se construye tu puntuación de riesgo, y remátalo con el análisis completo del navegador para las comprobaciones que viven puerta con puerta: zona horaria, WebRTC, fingerprints.
- Mueve tus idiomas con tu VPN. El arreglo limpio replica el consejo de la zona horaria: haz que la afirmación sea verdad. Añade el idioma del país de salida a la lista de tu navegador, en Chrome, en
chrome://settings/languages; en Firefox, en «Idiomas preferidos», y conserva el tuyo real al lado si quieres; la comprobación que ejecutan la mayoría de los sistemas es «¿encaja algún idioma?», no «¿encajan todos?». Eso sí, configúralo en los propios ajustes del navegador y no en una extensión, para que la cabecera y el JavaScript cambien a la vez. - Si gestionas varias identidades, esto no es trabajo para una página de ajustes. Cada perfil necesita que sus idiomas, su zona horaria y su IP cuenten una misma historia, en cada sesión, y editar ajustes a mano por cada identidad no sobrevive al contacto con el trabajo real. Incogniton configura el idioma de cada perfil para que encaje con el proxy de ese perfil, en la cabecera y en JavaScript a la vez, de modo que el navegador nunca discute con sus propios paquetes.
Tu navegador le dijo al último servidor que visitaste qué idioma lees. El widget de arriba te dice si tu IP respalda esa afirmación.