Máximo em valores de cabeçalho http?

326

Existe um tamanho máximo permitido aceito para cabeçalhos HTTP? Se assim for, o que é? Caso contrário, isso é algo específico do servidor ou é o padrão aceito para permitir cabeçalhos de qualquer tamanho?

Cory
fonte

Respostas:

316

Não, o HTTP não define nenhum limite. No entanto, a maioria dos servidores da Web limita o tamanho dos cabeçalhos que eles aceitam. Por exemplo, no limite padrão do Apache é 8KB, no IIS é 16K . O servidor retornará um 413 Entity Too Largeerro se o tamanho dos cabeçalhos exceder esse limite.

Pergunta relacionada: Qual o tamanho de uma sequência de agentes do usuário?

vartec
fonte
10
Esta resposta indica que o tamanho máximo de cabeçalho aceito pelo servidor. Mas qual é o tamanho máximo do cabeçalho que o servidor da Web (por exemplo, Apache) é capaz de enviar?
Pacerier
@ Pacerier: Isso significa 8175 bytes para o Apache, mas ainda estou pesquisando. Além disso, não espere receber mensagens de erro úteis se você encontrar esse limite a partir de qualquer back-end que seja.
26413 hakre
2
@hakre: IIRC, 8K para toda a linha, contando todas as linhas do cabeçalho (nomes dos cabeçalhos, espaço em branco e carga útil dos cabeçalhos).
vartec 26/05
Existe uma maneira de definir o tamanho máximo personalizado do cabeçalho?
Sudip Bolakhe 30/04/19
Provavelmente, o IIS está aberto para 16k por causa dos requisitos dos protocolos SPNego e Kerberos, e eles geralmente são usados ​​para "autenticação do Windows".
Ronan Kerdudou
220

Como a vartec diz acima, a especificação HTTP não define um limite, no entanto, muitos servidores o definem por padrão. Isso significa, na prática, o limite inferior é 8K . Para a maioria dos servidores, esse limite se aplica à soma da linha de solicitação e de TODOS os campos de cabeçalho (mantenha seus cookies curtos).

Vale ressaltar que o nginx usa o tamanho da página do sistema por padrão, que é de 4K na maioria dos sistemas. Você pode verificar com este pequeno 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;
}

Compile com, em gcc -o pagesize pagesize.cseguida, execute ./pagesize. Meu servidor ubuntu de Linode obedientemente me informa que a resposta é 4k.

David Schoonover
fonte
6
Para apache2, comprimento URL é controlada por LimitRequestLinee LimitRequestFieldSizeaplica-se a cada linha de cabeçalho HTTP indivually ... não a "soma de ..."
Yves Martin
1
Os cookies têm um limite de tamanho total separado de 4093 bytes. stackoverflow.com/questions/640938/…
Jeff Lowery 17/11
25
Não há necessidade de escrever código para obter o tamanho da página. De um terminal: getconf PAGESIZE
Ponytech
6
Provavelmente, isso mudou desde que a resposta foi escrita, mas a página nginx vinculada não corresponde à resposta. A página nginx indica que o tamanho padrão do buffer é 8k e que a solicitação pode usar 4 buffers por padrão (o tamanho do buffer limita o tamanho da linha de solicitação e de cada cabeçalho individual). Portanto, isso sugere que o nginx permite algo entre 16 e 32k (suponho que uma linha não possa ser dividida em dois buffers, portanto, os buffers podem não ser preenchidos até o fim).
Lily Ballard
adicionando o valor no Apache 2,4 que permanece o mesmo: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah
5

O HTTP não coloca um limite predefinido no comprimento de cada campo de cabeçalho ou no comprimento da seção do cabeçalho como um todo, conforme descrito na Seção 2.5. Várias limitações ad hoc no comprimento do campo do cabeçalho individual são encontradas na prática, geralmente dependendo da semântica do campo específico.

Os valores do cabeçalho HTTP são restritos pelas implementações do servidor. A especificação de HTTP não restringe o tamanho do cabeçalho.

Um servidor que recebe um campo de cabeçalho de solicitação ou conjunto de campos maior do que deseja processar DEVE responder com um código de status apropriado 4xx (Erro do cliente). Ignorar esses campos de cabeçalho aumentaria a vulnerabilidade do servidor para solicitar ataques de contrabando (Seção 9.5).

A maioria dos servidores retornará 413 Entity Too Largeou erro 4xx apropriado quando isso acontecer.

Um cliente PODE descartar ou truncar os campos de cabeçalho recebidos que são maiores do que o cliente deseja processar se a semântica do campo for tal que os valores descartados possam ser ignorados com segurança sem alterar o enquadramento da mensagem ou a semântica da resposta.

O tamanho do cabeçalho HTTP sem limite mantém o servidor exposto a ataques e pode reduzir sua capacidade de atender tráfego orgânico.

Fonte

realPK
fonte
2

Aqui está o limite do servidor da web mais popular

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

Também descobri que, em alguns casos, o motivo de 502/400 no caso de muitos cabeçalhos pode ser devido a um grande número de cabeçalhos, sem levar em consideração o tamanho. dos documentos

tune.http.maxhdr Define o número máximo de cabeçalhos em uma solicitação. Quando uma solicitação vem com um número de cabeçalhos maior que esse valor (incluindo a primeira linha), ela é rejeitada com o código de status "400 Solicitação incorreta". Da mesma forma, respostas muito grandes são bloqueadas com "502 Bad Gateway". O valor padrão é 101, o que é suficiente para todos os usos, considerando que o servidor Apache amplamente implantado usa o mesmo limite. Pode ser útil aumentar ainda mais esse limite para permitir temporariamente que um aplicativo com bugs funcione no momento em que for corrigido. Lembre-se de que cada novo cabeçalho consome 32 bits de memória para cada sessão, portanto, não exagere muito nesse limite.

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

Shay Rybak
fonte