Volver al Blog
Huella digital

Fingerprinting por medición de texto: métricas de fuentes con precisión subpíxel como señal de rastreo

Canvas measureText() devuelve valores de ancho de texto con precisión subpíxel que varían entre sistemas operativos debido a diferencias en los motores de renderizado de fuentes. Descubre cómo estas pequeñas diferencias numéricas se convierten en una huella digital fiable.

Introducción

Cuando un sitio web mide el ancho de una cadena de texto usando el método measureText() de la API Canvas, el resultado es un valor de punto flotante con precisión subpíxel. Estos valores varían entre sistemas operativos porque cada plataforma usa un motor de renderizado integrado diferente con su propio modelo aritmético interno. Las diferencias son diminutas, invisibles al ojo humano, pero son consistentes, reproducibles y medibles a través de JavaScript.

Esta precisión subpíxel convierte a measureText() en una de las señales de identificación de plataforma más fiables disponibles para los scripts de rastreo. A diferencia del fingerprinting de imagen Canvas, que requiere renderizar píxeles y hashear el resultado, el fingerprinting por medición de texto es rápido, ligero y produce un valor numérico directo que puede compararse instantáneamente. Una sola llamada toma microsegundos y devuelve un valor que identifica tu sistema operativo. Cuando un script de rastreo mide múltiples cadenas a múltiples tamaños de fuente, el resultado combinado se convierte en una señal de fingerprint fuerte.

Esto hace que la medición de texto sea un vector de rastreo utilizado activamente por sistemas de fingerprinting comerciales en sitios web de redes sociales, banca, procesamiento de pagos y comercio electrónico. No requiere permisos especiales, no genera comportamiento visible para el usuario y produce resultados estables entre sesiones de navegador. A medida que los navegadores mejoran las protecciones para otros vectores de fingerprinting, la medición de texto está recibiendo mayor atención porque es difícil proteger a nivel de API sin degradar el comportamiento de las aplicaciones web.

El enfoque a nivel de motor de BotBrowser

BotBrowser aborda el fingerprinting por medición de texto a nivel del motor del navegador, no mediante interceptación de API o post-procesamiento. Esta es una distinción arquitectónica fundamental que permite la protección sin detección y sin romper la funcionalidad web.

Ruta de renderizado de fuentes unificada

BotBrowser modifica el pipeline de renderizado de fuentes dentro de Chromium para asegurar que los cálculos de métricas de fuentes usen aritmética consistente en todas las plataformas. Independientemente de si BotBrowser se ejecuta en macOS, Windows o Linux, las matemáticas de escalado de fuentes para un perfil dado producen resultados idénticos.

Esto significa que cuando un perfil de fingerprint especifica una configuración de dispositivo particular, los resultados de measureText() coinciden con esa configuración exactamente, hasta el último dígito significativo. El motor de fuentes no simplemente devuelve los valores nativos del sistema anfitrión. En su lugar, calcula las métricas usando el modelo de renderizado definido por el perfil.

Consistencia impulsada por perfil

Cada perfil de fingerprint de BotBrowser codifica las características de métricas de texto del dispositivo perfilado. Cuando se carga el perfil, el motor de renderizado de fuentes produce mediciones que coinciden con el dispositivo original:

  • La misma cadena de texto al mismo tamaño de fuente devuelve el mismo valor de ancho, independientemente del sistema operativo anfitrión.
  • El mismo perfil cargado en macOS, Windows y Linux produce resultados de measureText() bit a bit idénticos.
  • Los resultados son internamente consistentes con otras señales relacionadas con fuentes (lista de fuentes, renderizado de texto Canvas, métricas de diseño CSS).

Esta consistencia se extiende a todas las propiedades del objeto TextMetrics, no solo a width. Los valores de actualBoundingBoxAscent, actualBoundingBoxDescent, fontBoundingBoxAscent, fontBoundingBoxDescent y bounding box izquierdo/derecho todos coinciden con el perfil.

Resultados bit a bit idénticos entre plataformas

El logro técnico clave son los resultados bit a bit idénticos. Esto significa que la representación de punto flotante del resultado de measureText() es idéntica byte a byte entre plataformas. No hay un umbral de "suficientemente cercano". Los valores son matemáticamente idénticos.

Este nivel de consistencia solo es posible con control a nivel de motor. Cualquier enfoque que opere por encima del motor de renderizado, como extensiones, proxies de API o wrappers de JavaScript, no puede lograr resultados bit a bit idénticos porque no puede controlar la aritmética real realizada por el motor de fuentes.

BotBrowser logra esto asegurando que las matemáticas de escalado de fuentes usen el mismo modelo de precisión independientemente de la plataforma anfitriona. El perfil define el comportamiento esperado, y el motor produce exactamente ese comportamiento. Las preferencias nativas de renderizado de fuentes del sistema anfitrión no afectan la salida.

Sin artefactos detectables

Porque la protección opera dentro del motor de renderizado:

  • measureText() devuelve valores nativos de JavaScript Number con precisión completa de punto flotante de doble precisión, exactamente como lo haría un navegador sin modificar.
  • No hay modificaciones de prototipos, no hay wrapping de funciones, no hay interceptación a nivel de JavaScript.
  • Los valores son consistentes con el renderizado de píxeles Canvas. El texto dibujado en un Canvas y luego medido píxel a píxel coincide con el ancho reportado por measureText().
  • No hay anomalías estadísticas en la distribución de valores entre diferentes tamaños de fuente y cadenas de texto.

Consistencia interna con otras señales

La protección de métricas de texto no opera de forma aislada. El perfil asegura que los valores de measureText() sean consistentes con todas las demás señales observables de fuentes y renderizado. Si un script de rastreo valida cruzadamente las métricas de texto contra la salida de píxeles Canvas, los resultados de enumeración de fuentes o las mediciones de diseño CSS, todas las señales se alinean con la misma identidad de dispositivo. Esta coherencia interna es crítica, porque los sistemas de fingerprinting buscan cada vez más desajustes entre diferentes tipos de señales como indicador de manipulación.

Configuración y uso

Uso por CLI

Lanza BotBrowser con un perfil de fingerprint para habilitar la protección de medición de texto:

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Para resultados determinísticos entre ejecuciones, agrega una semilla de ruido:

chrome --bot-profile="/path/to/profile.enc" \
       --bot-noise-seed=12345 \
       --user-data-dir="$(mktemp -d)"

Combina con configuraciones de zona horaria, localización y proxy para consistencia de identidad completa:

chrome --bot-profile="/path/to/profile.enc" \
       --bot-noise-seed=12345 \
       --proxy-server="socks5://user:pass@proxy:1080" \
       --bot-config-timezone="America/New_York" \
       --bot-config-locale="en-US" \
       --bot-config-languages="en-US,en"

Integración con Playwright

const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
      '--bot-noise-seed=42',
    ],
    headless: true,
  });

  const context = await browser.newContext({ viewport: null });
  const page = await context.newPage();

  await page.goto('https://example.com');

  // measureText() results will be consistent with the loaded profile
  const metrics = await page.evaluate(() => {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    ctx.font = '16px Arial';
    const measurement = ctx.measureText('Sample text for measurement');
    return {
      width: measurement.width,
      actualBoundingBoxAscent: measurement.actualBoundingBoxAscent,
      actualBoundingBoxDescent: measurement.actualBoundingBoxDescent,
    };
  });

  console.log('Text metrics:', metrics);

  await browser.close();
})();

Integración con Puppeteer

const puppeteer = require('puppeteer-core');

(async () => {
  const browser = await puppeteer.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
      '--bot-noise-seed=42',
    ],
    headless: true,
    defaultViewport: null,
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');

  // Verify text measurement from the loaded profile
  const metrics = await page.evaluate(() => {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    ctx.font = '16px Arial';
    const m = ctx.measureText('Sample text for measurement');
    return { width: m.width };
  });

  console.log('Text width:', metrics.width);

  await browser.close();
})();

Verificación

Después de lanzar BotBrowser con un perfil, verifica que la protección de medición de texto esté activa:

const width = await page.evaluate(() => {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  ctx.font = '16px Arial';
  return ctx.measureText('Verification string').width;
});
console.log('Text width:', width);

Qué verificar:

  1. El valor de ancho es un número de punto flotante de precisión completa, consistente con lo que un dispositivo real con la plataforma objetivo del perfil devolvería.
  2. Recargar la página y repetir la medición produce el mismo valor.
  3. Reiniciar el navegador con el mismo perfil y semilla de ruido produce el mismo valor.
  4. Visita sitios de prueba de fingerprint como BrowserLeaks o CreepJS y confirma que no se señalan inconsistencias entre señales.

Mejores prácticas

Siempre usa un perfil completo

La protección de medición de texto funciona como parte del perfil completo de fingerprint de BotBrowser. El perfil asegura que las métricas de texto sean consistentes con todas las demás señales del navegador: renderizado Canvas, listas de fuentes, parámetros WebGL e información del sistema. Cargar un perfil es necesario para que la protección de medición de texto esté activa.

Combina con identidad de red

Las métricas de texto identifican la plataforma. Las señales de red identifican la ubicación. Para una identidad consistente, combina el perfil de fingerprint con la configuración apropiada de proxy y localización:

chrome --bot-profile="/path/to/profile.enc" \
       --proxy-server="socks5://user:pass@proxy:1080" \
       --bot-config-timezone="Europe/London" \
       --bot-config-locale="en-GB" \
       --bot-config-languages="en-GB,en"

Usa el modo determinístico para pruebas

Al ejecutar pruebas automatizadas o experimentos de investigación, usa --bot-noise-seed para asegurar resultados reproducibles. Esto te permite verificar que las métricas de texto permanezcan estables entre ejecuciones de prueba y detectar cualquier regresión en la consistencia de las métricas.

Prueba con múltiples configuraciones de fuentes

Al verificar la protección, prueba con una variedad de familias de fuentes y tamaños. Incluye tanto fuentes web comunes como valores predeterminados del sistema en tu conjunto de pruebas. Esto asegura una cobertura completa de la consistencia de las métricas de texto de tu perfil en el rango de fuentes que los scripts de rastreo típicamente sondean.

Mantén los perfiles y BotBrowser actualizados

El fingerprinting por medición de texto continúa evolucionando. Se han agregado nuevas propiedades de TextMetrics en versiones recientes del navegador, y los scripts de rastreo actualizan su recolección para incluir estas nuevas señales. Mantén tu instalación de BotBrowser y tus perfiles actualizados para asegurar la cobertura de propiedades recientemente explotables.

FAQ

¿Qué es el fingerprinting por medición de texto?

El fingerprinting por medición de texto usa la API Canvas measureText() para determinar en qué plataforma se ejecuta un navegador. La API devuelve valores de ancho de texto con precisión subpíxel, y estos valores difieren entre sistemas operativos porque cada SO usa un motor de renderizado integrado diferente con su propio modelo aritmético interno. Al medir cadenas de texto específicas a tamaños específicos, un script de rastreo puede identificar el sistema operativo y distinguir dispositivos individuales.

¿En qué se diferencia del fingerprinting Canvas?

El fingerprinting Canvas renderiza contenido visual (texto, formas, gradientes) en un elemento Canvas y hashea los datos de píxeles resultantes. El fingerprinting por medición de texto usa measureText() para obtener valores numéricos de ancho sin renderizar nada visible. La medición de texto es más rápida, produce un resultado numérico directo y proporciona un tipo diferente de señal. Ambas técnicas dependen de diferencias de renderizado específicas de la plataforma, pero operan en diferentes salidas de la API Canvas. Puedes aprender más sobre el fingerprinting Canvas en nuestra guía de Canvas Fingerprinting.

¿BotBrowser produce valores idénticos en todas las plataformas?

Sí. Cuando se carga el mismo perfil de fingerprint, BotBrowser produce resultados de measureText() bit a bit idénticos en macOS, Windows y Linux. Esto se logra mediante el control a nivel de motor de las matemáticas de renderizado de fuentes, asegurando que el mismo perfil siempre produzca los mismos resultados numéricos independientemente del sistema operativo anfitrión.

¿La protección de medición de texto rompe sitios web?

No. BotBrowser no bloquea ni modifica la API measureText(). La API funciona normalmente, devolviendo valores precisos de ancho de texto que las aplicaciones web pueden usar para diseño, truncamiento de texto, renderizado de gráficos y todos los demás propósitos legítimos. Los valores simplemente son consistentes con el perfil cargado en lugar del renderizado nativo del sistema anfitrión.

¿Cómo se relaciona esto con el fingerprinting de fuentes?

El fingerprinting por medición de texto está estrechamente relacionado con el fingerprinting de fuentes pero apunta a una señal diferente. El fingerprinting de fuentes identifica qué fuentes están instaladas verificando si familias de fuentes específicas están disponibles. El fingerprinting por medición de texto identifica cómo el motor de renderizado procesa esas fuentes examinando valores de métricas subpíxel. Ambas señales se derivan de la pila de renderizado de fuentes, y ambas están cubiertas por la protección a nivel de motor de BotBrowser. Para una visión más amplia, consulta nuestro artículo sobre fingerprinting de navegador.

¿Puedo usar la protección de medición de texto de BotBrowser con frameworks de automatización existentes?

Sí. BotBrowser se integra con Playwright, Puppeteer, Selenium y otros frameworks de automatización. La protección de medición de texto está automáticamente activa cuando se carga un perfil de fingerprint. No se necesitan cambios de configuración o código adicionales más allá de pasar el flag --bot-profile. Consulta la guía de inicio con Playwright y la guía de inicio con Puppeteer para instrucciones de configuración.

¿Esta protección cubre todas las propiedades de TextMetrics?

Sí. La protección de BotBrowser cubre el conjunto completo de propiedades de TextMetrics, incluyendo width, actualBoundingBoxLeft, actualBoundingBoxRight, actualBoundingBoxAscent, actualBoundingBoxDescent, fontBoundingBoxAscent y fontBoundingBoxDescent. Todos los valores son consistentes con el perfil cargado en todas las plataformas.

Resumen

El fingerprinting por medición de texto usa la precisión subpíxel de la API Canvas measureText() para identificar navegadores por su motor de renderizado. Porque cada sistema operativo usa un motor de renderizado integrado diferente con su propio modelo aritmético interno, el mismo texto al mismo tamaño de fuente produce valores de ancho mediblemente diferentes en cada plataforma. Estas diferencias son consistentes, reproducibles y recolectadas activamente por sistemas de rastreo comerciales.

BotBrowser aborda el fingerprinting por medición de texto a nivel del motor del navegador controlando las matemáticas de renderizado de fuentes dentro de Chromium. Cuando se carga un perfil de fingerprint, los cálculos de escalado de fuentes producen resultados bit a bit idénticos en macOS, Windows y Linux. No hay hooks a nivel de API, no hay modificaciones de prototipos y no hay anomalías estadísticas. Los valores son internamente consistentes con todas las demás señales de fuentes y Canvas en el perfil, asegurando que las verificaciones cruzadas de los scripts de fingerprinting no encuentren desajustes.

Combinada con la protección de BotBrowser para renderizado Canvas, enumeración de fuentes y consistencia de perfiles multiplataforma, la protección de medición de texto cierra uno de los vectores de fingerprinting más precisos disponibles para los sistemas de rastreo hoy en día. er-fingerprinting).

Puedo usar la proteccion de medicion de texto de BotBrowser con frameworks de automatizacion existentes?

Si. BotBrowser se integra con Playwright, Puppeteer, Selenium y otros frameworks de automatizacion. La proteccion de medicion de texto se activa automaticamente cuando se carga un perfil de fingerprint. No se necesitan cambios adicionales de configuracion o codigo mas alla de pasar el flag --bot-profile. Consulta la guia de inicio de Playwright y la guia de inicio de Puppeteer para instrucciones de configuracion.

Esta proteccion cubre todas las propiedades de TextMetrics?

Si. La proteccion de BotBrowser cubre el conjunto completo de propiedades de TextMetrics, incluyendo width, actualBoundingBoxLeft, actualBoundingBoxRight, actualBoundingBoxAscent, actualBoundingBoxDescent, fontBoundingBoxAscent y fontBoundingBoxDescent. Todos los valores son consistentes con el perfil cargado en todas las plataformas.

Resumen

El fingerprinting por medicion de texto utiliza la precision subpixel de la API Canvas measureText() para identificar navegadores por su motor de renderizado. Dado que cada sistema operativo utiliza un motor de renderizado incorporado diferente con su propio modelo aritmetico interno, el mismo texto al mismo tamano de fuente produce valores de ancho mediblemente diferentes en cada plataforma. Estas diferencias son consistentes, reproducibles y recopiladas activamente por sistemas comerciales de rastreo.

BotBrowser aborda el fingerprinting por medicion de texto a nivel del motor del navegador controlando las matematicas de renderizado de fuentes dentro del propio Chromium. Cuando se carga un perfil de fingerprint, los calculos de escalado de fuentes producen resultados identicos a nivel de bits en macOS, Windows y Linux. No hay hooks a nivel de API, no hay modificaciones de prototipo y no hay anomalias estadisticas. Los valores son internamente consistentes con todas las demas senales de fuentes y Canvas en el perfil, asegurando que las verificaciones cruzadas de los scripts de fingerprinting no encuentren discrepancias.

Combinado con la proteccion de BotBrowser para renderizado Canvas, enumeracion de fuentes y consistencia de perfiles multiplataforma, la proteccion de medicion de texto cierra uno de los vectores de fingerprinting mas precisos disponibles para los sistemas de rastreo actuales.

#text measurement#measureText#fingerprinting#font metrics#canvas#sub-pixel#privacy#cross-platform

¿Listo para proteger tu huella digital?

BotBrowser ofrece control de huellas a nivel de motor con perfiles de dispositivos reales. Comience gratis o explore todas las funciones.