Contar sin usar una cookie
Un contador de visitas tiene una tarea incómoda: debe distinguir una visita de otra. Si no puede hacerlo, una sola persona que recarga una página diez veces parece diez personas, y el número que aparece en el sitio es ficción.
La solución habitual es una cookie. Este sitio no utiliza ninguna. A continuación se explica qué hace en su lugar, y por qué la versión honesta de esa frase costó trabajo conseguir.
La cookie que nadie pidió
Hasta este año, cada solicitud al contador iniciaba una sesión PHP. Es una sola línea de código, parece inofensiva, y significaba que todos los visitantes de todos los sitios que usaban un contador de Stats4U recibían una cookie de sesión, establecida por nosotros, en páginas ajenas, sin que ninguna de las dos partes lo pretendiera.
La sesión nunca se usó para nada. La prueba fue fácil de encontrar en cuanto alguien miró: el directorio donde se almacenan las sesiones contenía cero archivos. Llevaba años estableciendo una cookie en los sitios web de otras personas para guardar datos que nunca se escribían ni se leían.
Ha desaparecido de la ruta de conteo. Ahora solo se inicia una sesión cuando alguien crea o reconfigura un contador, una acción que realiza deliberadamente, en este sitio.
Qué la sustituyó
Los visitantes se distinguen mediante un hash. En él entran cinco elementos:
- la dirección IP
- el user agent
- el ID del contador
- la fecha de hoy
- un secreto que cambia cada día
El resultado son 16 bytes, que es lo que se almacena. Se conserva durante dos días y luego se elimina. La dirección IP en sí nunca se registra en ningún momento.
Dos visitas de la misma persona el mismo día al mismo contador producen los mismos 16 bytes, por lo que la segunda se reconoce como repetida. Mañana esa misma persona producirá algo completamente distinto, porque tanto la fecha como el secreto habrán cambiado. Ese es todo el mecanismo.
Por qué el secreto rota
Esta es la parte fácil de hacer mal, y aquí estuvo mal hasta este año.
La versión anterior usaba un único secreto permanente. Eso seguía produciendo hashes distintos para personas distintas, lo cual suena bien. Pero significaba que cualquiera que tuviera ese secreto podía tomar una dirección IP sospechosa y recalcular su hash para cualquier día del archivo, convirtiendo una tabla de valores anónimos de 16 bytes de nuevo en un registro de quién visitó qué, hasta donde alcanzaran los datos.
El secreto ahora cambia a diario y los anteriores se eliminan a los dos días. Una vez hecho esto, el cálculo ya no se puede ejecutar, por nadie. Eso incluye a quien administra este sitio, que es precisamente la idea: una protección que depende de la buena conducta del operador no es una protección, es una promesa.
La resolución de pantalla, y una lección sobre eliminar cosas
Antes se recopilaba la resolución de pantalla. Es una señal clásica de fingerprinting y no valía lo que costaba, así que se eliminó del script que se ejecuta en la página.
Eso no fue suficiente, y vale la pena conocer el motivo a la hora de construir algo para los sitios web de otras personas. El script se sirve con una vida de caché de siete días, así que las copias antiguas siguieron activas en los navegadores de los visitantes durante una semana después del cambio. Peor aún, algunos sitios no enlazan al script en absoluto: pegaron una copia en sus propias páginas hace años, y esa copia seguirá haciendo exactamente lo que hacía el día en que se pegó, para siempre.
Así que la resolución siguió llegando. La solución fue hacer que el servidor rechazara el valor, sin importar quién lo enviara. Eliminar una recopilación de datos del cliente solo detiene a los clientes nuevos. Eliminarla del servidor la detiene de inmediato.
Una comprobación independiente
Nada de esto vale mucho como simple afirmación, así que aquí está el comando:
- curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie
Si no hay salida, significa que no se estableció ninguna cookie.
Una advertencia final, la misma de siempre: esto describe lo que hace el software. Si satisface las normas vigentes en un país concreto es una pregunta para alguien cualificado para responderla, y esta no es esa respuesta.
Actualización del 11 de septiembre de 2026: A partir del 27 de agosto de 2026, el script volvió a leer la resolución de pantalla, el ancho de la ventana del navegador y la relación de píxeles en todos los sitios que lo insertaban. Desde el 11 de septiembre de 2026 solo lo hace donde el propietario del sitio lo activa con data-screen="1". Sin ese atributo, el script actual no lee ninguno de los tres valores, y el servidor tampoco los guarda ya cuando llegan desde copias antiguas.