Massimo sui valori di intestazione http?


326

Esiste una dimensione massima consentita accettata per le intestazioni HTTP? Se è così, che cosa è? In caso contrario, è qualcosa che è specifico del server o è lo standard accettato per consentire intestazioni di qualsiasi dimensione?

Risposte:


316

No, HTTP non definisce alcun limite. Tuttavia, la maggior parte dei server Web limita la dimensione delle intestazioni che accetta. Ad esempio, il limite predefinito di Apache è 8 KB, in IIS è 16 KB . Il server restituirà un 413 Entity Too Largeerrore se la dimensione delle intestazioni supera tale limite.

Domanda correlata: quanto può essere grande una stringa dell'agente utente?


10
Questa risposta afferma che la dimensione massima accettata dell'intestazione da parte del server. Ma qual è la dimensione massima dell'intestazione che il server Web (ad esempio Apache) è in grado di inviare?
Pacerier,

@Pacerier: sembra 8175 byte per Apache, ma sto ancora cercando. Inoltre, non aspettarti di ricevere utili messaggi di errore se ti imbatti in un tale limite da qualunque backend.
Hakre,

2
@hakre: IIRC, 8K per l'intera riga, contando tutte le righe di intestazione (nomi delle intestazioni, spazi vuoti e payload delle intestazioni).
vartec,

C'è un modo per definire la dimensione massima personalizzata dell'intestazione?
Sudip Bolakhe,

Probabilmente IIS è aperto a 16k a causa dei requisiti dei protocolli SPNego e Kerberos e sono spesso usati per "l'autenticazione di Windows".
Ronan Kerdudou,

220

Come dice vartec sopra, le specifiche HTTP non definiscono un limite, tuttavia molti server lo fanno di default. Ciò significa, praticamente parlando, il limite inferiore è 8K . Per la maggior parte dei server, questo limite si applica alla somma della riga della richiesta e di TUTTI i campi di intestazione (quindi mantieni i cookie brevi).

Vale la pena notare che nginx utilizza le dimensioni della pagina del sistema per impostazione predefinita, che è 4K sulla maggior parte dei sistemi. Puoi verificare con questo piccolo programma:

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;
}

Compilare con gcc -o pagesize pagesize.cquindi eseguire ./pagesize. Il mio server Ubuntu di Linode mi informa debitamente che la risposta è 4K.


6
Per apache2, la lunghezza dell'URL è controllata LimitRequestLinee si LimitRequestFieldSizeapplica a ciascuna riga di intestazione HTTP singolarmente ... non alla "somma di ..."
Yves Martin

1
I cookie hanno un limite di dimensione totale separato di 4093 byte. stackoverflow.com/questions/640938/…
Jeff Lowery,

25
Non è necessario scrivere codice per ottenere le dimensioni della pagina. Da un terminal: getconf PAGESIZE
Ponytech

6
Ciò è probabilmente cambiato da quando è stata scritta questa risposta, ma la pagina nginx collegata non corrisponde alla risposta. La pagina nginx indica che la dimensione del buffer predefinita è 8k e che la richiesta può utilizzare 4 buffer per impostazione predefinita (la dimensione del buffer stesso limita la dimensione della riga della richiesta e di ogni singola intestazione). Quindi questo suggerisce che nginx tiene conto tra 16 e 32k (suppongo che una riga non possa essere divisa su due buffer, quindi i buffer potrebbero non essere riempiti fino in fondo).
Lily Ballard,

aggiungendo il valore su apache 2.4 che rimane lo stesso: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah

5

HTTP non pone un limite predefinito sulla lunghezza di ciascun campo di intestazione o sulla lunghezza della sezione di intestazione nel suo insieme, come descritto nella Sezione 2.5. Nella pratica si trovano varie limitazioni ad hoc sulla lunghezza del campo dell'intestazione individuale, spesso a seconda della semantica del campo specifico.

I valori dell'intestazione HTTP sono limitati dalle implementazioni del server. Le specifiche HTTP non limitano le dimensioni dell'intestazione.

Un server che riceve un campo di intestazione della richiesta, o un insieme di campi, più grande di quello che desidera elaborare DEVE rispondere con un codice di stato 4xx (Errore client) appropriato. Ignorare tali campi di intestazione aumenterebbe la vulnerabilità del server per richiedere attacchi di contrabbando (Sezione 9.5).

La maggior parte dei server restituirà 413 Entity Too Largeun errore 4xx appropriato quando ciò accade.

Un client PU disc scartare o troncare i campi di intestazione ricevuti che sono più grandi di quelli che il cliente desidera elaborare se la semantica dei campi è tale che i valori rilasciati possono essere ignorati in modo sicuro senza modificare l'inquadramento dei messaggi o la semantica di risposta.

Le dimensioni dell'intestazione HTTP senza cappuccio mantengono il server esposto agli attacchi e possono ridurre la sua capacità di servire traffico organico.

fonte


2

Ecco il limite del web server più popolare

  • Apache - 8K
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Tomcat - 8K - 48K

1

Ho anche scoperto che in alcuni casi il motivo di 502/400 nel caso di molte intestazioni potrebbe essere dovuto a un gran numero di intestazioni indipendentemente dalle dimensioni. dai documenti

tune.http.maxhdr Imposta il numero massimo di intestazioni in una richiesta. Quando una richiesta arriva con un numero di intestazioni maggiore di questo valore (inclusa la prima riga), viene rifiutata con un codice di stato "400 Bad Request". Allo stesso modo, le risposte troppo grandi vengono bloccate con "502 Bad Gateway". Il valore predefinito è 101, che è sufficiente per tutti gli usi, considerando che il server Apache ampiamente distribuito utilizza lo stesso limite. Può essere utile spingere ulteriormente questo limite per consentire temporaneamente a un'applicazione buggy di funzionare quando viene riparata. Tieni presente che ogni nuova intestazione consuma 32 bit di memoria per ogni sessione, quindi non spingere questo limite troppo alto.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.