¿Cómo puede un servidor web (http) saber si la solicitud proviene de un navegador o no?

Los navegadores envían y reciben mucha información en los llamados “encabezados”; uno de estos es el encabezado User-Agent , que generalmente contiene información sobre el navegador, el motor de procesamiento e incluso el sistema operativo en el que se ejecuta.

Estrictamente hablando, un cliente no tiene que enviar esta información, pero generalmente lo hace, porque ayuda a que la aplicación web responda correctamente, por ejemplo, presentando el contenido en el formato correcto (móvil o de escritorio, por ejemplo), o para que se muestre correctamente dependiendo en el navegador

Los robots de rastreo web (los programas utilizados por los motores de búsqueda y otras entidades para rastrear automáticamente la web) también suelen identificarse de esta manera. Aquí hay una página que muestra cómo los bots más populares (incluido Google) se identifican por su encabezado de agente de usuario: Lista de cadenas de agente de usuario de rastreador

Como otro ejemplo, aquí está el Agente de usuario de mi navegador:

Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 40.0.2214.111 Safari / 537.36

Si está ejecutando Chrome, Firefox o Internet Explorer, puede abrir las herramientas de desarrollador (creo que F12 lo abre en todas ellas), donde puede examinar las solicitudes y respuestas (la conversación entre el navegador y los servidores en Internet). Allí verás estos encabezados.

Sin embargo, un servidor web (o más bien la aplicación web) no sabrá la diferencia si esta información de encabezado no está presente. Pruebe esto: abra una consola y escriba:

telnet www.quora.com 80

Esto abre una conexión al servidor web http://www.quora.com (en el puerto 80, el puerto HTTP predeterminado). En el mensaje que sigue, ingrese

GET /

El servidor web responde con algún código HTML, aunque no sabe qué agente de usuario (navegador, etc.) envió la solicitud. Sin embargo, es posible que no todos los servidores web respondan igual; depende de cómo se programe el lado del servidor.

Hola,

Además de las otras respuestas donde se menciona la información del encabezado, a continuación se muestran dos ejemplos de cómo obtener la información del navegador de la solicitud:

1. PHP:

echo $ _SERVER [‘HTTP_USER_AGENT’]. “\ n \ n”;

$ browser = get_browser (nulo, verdadero);
print_r ($ browser);
?>

2. NodoJS:

var ua = request.headers [‘agente de usuario’];
console.log (‘Agente de usuario es:’, ua);

También debe tener en cuenta que el solicitante no necesariamente es un navegador. En este caso, el remitente podría manipular los encabezados de la solicitud e imitar un navegador en el encabezado. En ese caso, hay más para ver, lo que probablemente está más allá del alcance de esta pregunta.

En el lado del servidor solo está recibiendo datos. El servidor solo puede tomar estas decisiones en función de los datos que recibe. Los datos se pueden manipular, pero puede hacer que sea más difícil hacer trampa:

  • validar si una solicitud vino de un navegador usando JavaScript
  • requerir que se establezcan cookies
  • requiere iniciar sesión con captcha
  • requiere autenticación de 2 factores
  • obtener información del usuario de terceros

Además de las excelentes respuestas ya publicadas, me gustaría enfatizar que no hay una forma segura de determinar que el usuario es un navegador, ya que los encabezados HTTP se pueden manipular fácilmente.
Lo mismo se aplica a los bots: los bots buenos informarán su identidad voluntariamente, pero los bots malos probablemente falsificarán esta información.

La solicitud http contiene un agente de usuario con información sobre el navegador solicitante.