Pruebas de seguridad: mensajes HTTP

Mensajes HTTP

HTTP se basa en un modelo de arquitectura cliente-servidor y un protocolo de solicitud / respuesta sin estado que opera mediante el intercambio de mensajes a través de una conexión TCP / IP confiable.

Un "cliente" HTTP es un programa (navegador web o cualquier otro cliente) que establece una conexión a un servidor con el propósito de enviar uno o más mensajes de solicitud HTTP. Un "servidor" HTTP es un programa (generalmente un servidor web como Apache Web Server o Internet Information Services IIS, etc.) que acepta conexiones para atender solicitudes HTTP mediante el envío de mensajes de respuesta HTTP.

HTTP utiliza el identificador uniforme de recursos (URI) para identificar un recurso determinado y establecer una conexión. Una vez establecida la conexión, los mensajes HTTP se pasan en un formato similar al utilizado por el correo de Internet [RFC5322] y las Extensiones de correo de Internet multipropósito (MIME) [RFC2045]. Estos mensajes consisten en solicitudes de cliente a servidor y respuestas de servidor a cliente que tendrán el siguiente formato:

HTTP-message = <Request> | <Response> ; HTTP/1.1 messages

La solicitud HTTP y la respuesta HTTP utilizan un formato de mensaje genérico de RFC 822 para transferir los datos requeridos. Este formato de mensaje genérico consta de los siguientes cuatro elementos:

  • Una línea de salida

  • Cero o más campos de encabezado seguidos de CRLF

  • Una línea vacía (es decir, una línea sin nada antes de la CRLF) que indica el final de los campos del encabezado

  • Opcionalmente un cuerpo de mensaje

La siguiente sección explicará cada una de las entidades utilizadas en el mensaje HTTP.

Línea de inicio de mensaje

Una línea de salida tendrá la siguiente sintaxis genérica:

start-line = Request-Line | Status-Line

Analizaremos Request-Line y Status-Line mientras hablamos de los mensajes HTTP Request y HTTP Response respectivamente. Por ahora, veamos los ejemplos de la línea de inicio en caso de solicitud y respuesta:

GET /hello.htm HTTP/1.1     (This is Request-Line sent by the client)

HTTP/1.1 200 OK             (This is Status-Line sent by the server)

Campos de encabezado

Los campos de encabezado HTTP proporcionan información necesaria sobre la solicitud o respuesta, o sobre el objeto enviado en el cuerpo del mensaje. Existen los siguientes cuatro tipos de encabezados de mensajes HTTP:

  • General-header - Estos campos de encabezado tienen aplicabilidad general tanto para mensajes de solicitud como de respuesta.

  • Request-header - Estos campos de encabezado son aplicables solo para mensajes de solicitud.

  • Response-header - Estos campos de encabezado son aplicables solo para mensajes de respuesta.

  • Entity-header - Estos campos de encabezado definen metainformación sobre la entidad-cuerpo o, si no hay ningún cuerpo presente.

Todos los encabezados mencionados anteriormente siguen el mismo formato genérico y cada uno de los campos de encabezado consta de un nombre seguido de dos puntos (:) y el valor del campo de la siguiente manera:

message-header = field-name ":" [ field-value ]

A continuación se muestran ejemplos de varios campos de encabezado:

User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain

Cuerpo del mensaje

La parte del cuerpo del mensaje es opcional para un mensaje HTTP, pero si está disponible, se usa para llevar el cuerpo de la entidad asociado con la solicitud o respuesta. Si el cuerpo de la entidad está asociado, normalmenteContent-Type y Content-Length Las líneas de encabezado especifican la naturaleza del cuerpo asociado.

El cuerpo de un mensaje es el que contiene datos de solicitud HTTP reales (incluidos los datos del formulario y cargados, etc.) y datos de respuesta HTTP del servidor (incluidos archivos, imágenes, etc.). A continuación se muestra un contenido simple del cuerpo de un mensaje:

<html>
   <body>
      <h1>Hello, World!</h1>
   </body>
</html>