Categorías: Labs

La detección de Agente de Usuario, historia y lista de verificación

Este artículo es una traducción del original publicado en blog de Mozilla Hacks.

Historia

User-Agent: <algo> es una cadena de caracteres enviada por los clientes HTTP (navegadores, robots, aplicaciones de calendarios, etc.) en cada petición HTTP a un servidor. El protocolo HTTP definido en 1991 no tiene este campo, pero la siguiente versión definida en 1992 agregó el User-Agent (agente de usuario) en las cabeceras de las peticiones HTTP. Su sintaxis fue definida como “el nombre del producto, con un slash opcional y una versión designada”. La descripción ya invitaba a la gente a usarlo con fines analíticos e identificar productos con problemas de implementación.

Esta línea, si está presente, determina el programa de software usado por el cliente original. Esto es para propósitos estadísticos y para rastrear violaciones del protocolo. Debería incluirse.

Avancemos hasta agosto de 2013, y la especificación HTTP/1.1 está siendo revisada y también define User-Agent.

Un agente de usuario NO DEBE generar un campo User-Agent conteniendo innecesariamente un detalle minucioso y DEBE limitar la adición de subproductos por parte de terceros. Los valores del campo User-Agent muy largos y detallados incrementan la latencia de la petición y el riesgo de un usuario siendo identificado en contra de sus deseos (“fingerprinting” – como una huella digital).

Del mismo modo, las implementaciones son motivadas a no usar identificadores de productos de otras implementaciones para declarar compatibilidad con ellos, ya que esto niega el propósito del campo. Si un agente de usuario se disfraza de un agente de usuario diferente, los destinatarios pueden asumir que el usuario desea intencionalmente ver las respuestas adaptadas para el agente de usuario identificado, aún si esas respuestas no trabajan muy bien para el agente de usuario que está siendo usado.

Básicamente, la especificación HTTP desaprueba desde sus comienzos la detección de la cadena de User-Agent para adaptar la experiencia del usuario. Actualmente, las cadenas de agente de usuario se han vuelto demasiado largas. Son abusadas en todas las maneras posibles. Incluyen información detallada. Mienten acerca de lo que son realmente y son usadas para generar renombre y publicidad de los dispositivos en que se ejecutan.

Detección del Agente de Usuario

La detección del agente de usuario (o sniffing) es un mecanismo usado para analizar la cadena de User-Agent e inferir propiedades físicas y aplicativas acerca del dispositivo y su navegador. Pero dejemos las cosas claras. La detección del agente de usuario es una estrategia que fallará en el futuro. Por diseño, tú puedes detectar solamente lo que sabes, no lo que vendrá. El espacio de los dispositivos compactos (smartphones, tablets, relojes, Arduino, etc.) es un espacio que evoluciona muy rápido. La diversidad, en términos de características físicas, solamente puede incrementar. Actualizando bases de datos y algoritmos para la identificación correcta es una tarea de alto mantenimiento que está condenada al fracaso en algún momento futuro. Los sitios web son abandonados, las librerías no son mantenidas y los sitios fallarán sólo porque no fueron planeados para dispositivos que vendrán en un futuro. Todo esto tiene un costo en recursos y renombre.

Nuevas soluciones están siendo desarrolladas para ayudar a la gente a ajustar la experiencia del usuario dependiendo de las capacidades de los productos, no por su nombre. El diseño adaptativo ayuda a crear sitios web que se ajustan a diferentes tamaños de pantallas. Cada vez que detectas un nuevo producto o una característica, es importante entender a fondo el por qué la estás usando para detectar esta característica. Podrías caer en las mismas trampas como las que existen con los algoritmos de detección del agente de usuario.

Tenemos que tratar diariamente con una detección de agente de usuario abusiva bloqueando Firefox OS y/o Firefox para Android. Esto no solamente en los productos de Mozilla, todos los productos y marcas tiene que tratar en algún momento con el hecho de ser excluidos porque no tiene el identificador correcto para ser aprobados por un algoritmo mal codificado. La detección de agente de usuario lleva a la situación en donde un nuevo jugador tiene dificultades para entrar al mercado, aún teniendo el conjunto correcto de tecnologías. Recuerda que hay muchos beneficios al crear un sistema flexible a muchas situaciones.

Algunas compañías usan la cadena de User-Agent como un identificador para pasar por un sistema de pago o para ofrecer contenido específico para un grupo de usuarios durante una campaña publicitaria. Esto parece ser una solución fácil a primera vista, pero esto crea un entorno fácil de saltarse con la suplantación del agente de usuario.

Firefox y el Móvil

Firefox OS y Firefox para Android tienen cadenas de User-Agent documentadas y sencillas.

Firefox OS

Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0

Firefox para Android

Mozilla/5.0 (Android; Mobile; rv:18.0) Gecko/18.0 Firefox/18.0

El caso más usado de detección de agente de usuario es para saber si el dispositivo es un móvil para redirigir a un sitio web dedicado a medida con contenido móvil. La recomendación es limitar tu detección más sencilla posible a la cadena haciendo coincidir la subcadena mobi en minúsculas.

/mobi/i

Si estás detectando en el lado del cliente con JavaScript, una posibilidad entre muchas puede ser:

// Colocar la cadena de User-Agente en minúsculas
var ua = navigator.userAgent.toLowerCase();
// Mucho mejor probar mobi que mobile (Firefox, Opera, IE)
 
if (/mobi/i.test(ua)) {
 
    // hacer algo aquí
 
} else {
 
    // si no es identificado, seguir haciendo algo útil
 
}

Puede que quieras agregar más que un identificador en la sentencia if.

/mobi|android|touch|mini/i.test(ua)

Recuerda que cualquiera que sea el número de identificadores que coloques aquí, podrías fallar en algún momento futuro. Algunos dispositivos no tendrán JavaScript, o podrán no tener el identificador correcto. El patrón o la longitud del identificador no era como se tenía planeado inicialmente. Las piedras en el camino son muchas, escoge el camino de la simplicidad.

Resumen: Lista de verificación de detección del agente de usuario

  1. No detectar cadenas de agente de usuario.
  2. Usar diseño adaptable para tus nuevos sitios móviles (con media queries de CSS).
  3. Si estás usando una característica específica, usa detección de características para mejorar, no bloquear.
  4. Y si finalmente tienes que usar detección de agente de usuario, usa las cadenas más sencillas y genéricas.
  5. Proporciona siempre un contenido alternativo para cualquiera que sea la solución que escogiste.

Practica. Aprende. Imagina. Modifica. Y empieza de nuevo. Habrá muchos bloqueos en el camino dependiendo del contexto, los requerimiento de negocio, infraestructura social de tu propia compañía. Mantén esta lista de verificación cerca a ti y acerca la web a más personas.

The following two tabs change content below.

AngelFQC

Web Developer at BeezNest Latino
Ingeniero de Sistemas y Computación. Desarrollador PHP. Mozilla Peru. Chamilo LMS Developer.