¿Máximo en valores de encabezado http?

326

¿Existe un tamaño máximo permitido para los encabezados HTTP? Si es así, ¿qué es? Si no es así, ¿es algo específico del servidor o es el estándar aceptado para permitir encabezados de cualquier tamaño?

Cory
fuente

Respuestas:

316

No, HTTP no define ningún límite. Sin embargo, la mayoría de los servidores web limitan el tamaño de los encabezados que aceptan. Por ejemplo, en Apache, el límite predeterminado es de 8 KB, en IIS es de 16 KB . El servidor devolverá un 413 Entity Too Largeerror si el tamaño de los encabezados excede ese límite.

Pregunta relacionada: ¿Qué tan grande puede ser una cadena de agente de usuario?

vartec
fuente
10
Esta respuesta indica que el tamaño máximo de encabezado aceptado por el servidor. Pero, ¿cuál es el tamaño máximo de encabezado que el servidor web (por ejemplo, Apache) es capaz de enviar?
Pacerier
@Pacerier: Eso es 8175 bytes para Apache, pero todavía estoy buscando. Tampoco espere recibir mensajes de error útiles si se encuentra con dicho límite desde cualquier backend que sea.
Hakre
2
@hakre: IIRC, 8K para toda la línea, contando todas las líneas de encabezado (nombres de encabezados, espacios en blanco y cargas útiles de encabezados).
vartec
¿Hay alguna manera de definir el tamaño máximo personalizado del encabezado?
Sudip Bolakhe
Probablemente IIS está abierto a 16k debido a los requisitos de los protocolos SPNego y Kerberos, y a menudo se usan para la "autenticación de Windows".
Ronan Kerdudou
220

Como dice vartec anteriormente, la especificación HTTP no define un límite, sin embargo, muchos servidores lo hacen de manera predeterminada. Esto significa, prácticamente hablando, el límite inferior es 8K . Para la mayoría de los servidores, este límite se aplica a la suma de la línea de solicitud y TODOS los campos de encabezado (así que mantenga sus cookies cortas).

Vale la pena señalar que nginx usa el tamaño de página del sistema de forma predeterminada, que es 4K en la mayoría de los sistemas. Puede verificar con este pequeño programa:

pagesize.c:

#include <unistd.h>
#include <stdio.h>

int main() {
    int pageSize = getpagesize();
    printf("Page size on your system = %i bytes\n", pageSize);
    return 0;
}

Compilar con gcc -o pagesize pagesize.cluego ejecutar ./pagesize. Mi servidor ubuntu de Linode me informa debidamente que la respuesta es 4k.

David Schoonover
fuente
66
Para apache2, la longitud de la URL está controlada por LimitRequestLine y se LimitRequestFieldSizeaplica a cada línea de encabezado HTTP de forma individual ... no la "suma de ..."
Yves Martin
1
Las cookies tienen un límite de tamaño total separado de 4093 bytes. stackoverflow.com/questions/640938/…
Jeff Lowery
25
No es necesario escribir código para obtener el tamaño de página. Desde una terminal: getconf PAGESIZE
Ponytech
66
Esto probablemente ha cambiado desde que se escribió esta respuesta, pero la página nginx vinculada no coincide con la respuesta. La página nginx indica que el tamaño predeterminado del búfer es 8k, y que la solicitud puede usar 4 búferes por defecto (el tamaño del búfer limita el tamaño de la línea de solicitud y cada encabezado individual). Esto sugiere que nginx permite entre 16 y 32k (supongo que una línea no se puede dividir en dos buffers, por lo que es posible que los buffers no se llenen por completo).
Lily Ballard
agregando el valor en Apache 2.4, que sigue siendo el mismo: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah
5

HTTP no establece un límite predefinido en la longitud de cada campo de encabezado o en la longitud de la sección de encabezado como un todo, como se describe en la Sección 2.5. En la práctica se encuentran varias limitaciones ad hoc en la longitud del campo de encabezado individual, a menudo dependiendo de la semántica de campo específica.

Los valores del encabezado HTTP están restringidos por las implementaciones del servidor. La especificación HTTP no restringe el tamaño del encabezado.

Un servidor que recibe un campo de encabezado de solicitud, o un conjunto de campos, más grande de lo que desea procesar DEBE responder con un código de estado 4xx (Error del cliente) apropiado. Ignorar tales campos de encabezado aumentaría la vulnerabilidad del servidor para solicitar ataques de contrabando (Sección 9.5).

La mayoría de los servidores devolverán el 413 Entity Too Largeerror 4xx correspondiente cuando esto ocurra.

Un cliente PUEDE descartar o truncar los campos de encabezado recibidos que sean más grandes de lo que el cliente desea procesar si la semántica del campo es tal que los valores descartados pueden ignorarse de manera segura sin cambiar el marco del mensaje o la semántica de respuesta.

El tamaño de encabezado HTTP sin límite mantiene al servidor expuesto a ataques y puede reducir su capacidad para servir tráfico orgánico.

Fuente

realPK
fuente
2

Aquí está el límite del servidor web más popular

  • Apache - 8K
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Tomcat - 8K - 48K
Sarath Ak
fuente
1

También descubrí que en algunos casos la razón de 502/400 en el caso de muchos encabezados podría deberse a una gran cantidad de encabezados sin importar el tamaño. de los documentos

tune.http.maxhdr Establece el número máximo de encabezados en una solicitud. Cuando una solicitud viene con un número de encabezados mayor que este valor (incluida la primera línea), se rechaza con un código de estado "400 Solicitud incorrecta". Del mismo modo, las respuestas demasiado grandes se bloquean con "502 Bad Gateway". El valor predeterminado es 101, que es suficiente para todos los usos, teniendo en cuenta que el servidor Apache ampliamente implementado utiliza el mismo límite. Puede ser útil ampliar aún más este límite para permitir temporalmente que una aplicación con errores funcione para cuando se solucione. Tenga en cuenta que cada nuevo encabezado consume 32 bits de memoria para cada sesión, por lo tanto, no empuje este límite demasiado alto.

https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr

Shay Rybak
fuente