Maksymalna wartość nagłówka http?


326

Czy jest akceptowany maksymalny dozwolony rozmiar nagłówków HTTP? Jeśli tak, co to jest? Jeśli nie, to czy jest to coś, co jest specyficzne dla serwera, czy też jest akceptowanym standardem pozwalającym na nagłówki dowolnej wielkości?

Odpowiedzi:


316

Nie, HTTP nie określa żadnego limitu. Jednak większość serwerów WWW ogranicza rozmiar akceptowanych nagłówków. Na przykład w Apache domyślny limit to 8 KB, w IIS 16 KB . Serwer zwróci 413 Entity Too Largebłąd, jeśli rozmiar nagłówków przekroczy ten limit.

Powiązane pytanie: Jak duży może być ciąg agenta użytkownika?


10
Ta odpowiedź stwierdza, że ​​maksymalny zaakceptowany rozmiar nagłówka przez serwer. Ale jaki jest maksymalny rozmiar nagłówka, który może wysłać serwer WWW (np. Apache)?
Pacerier

@Pacerier: To wygląda na 8175 bajtów dla Apache, ale wciąż szukam. Nie oczekuj też, że pojawią się przydatne komunikaty o błędach, jeśli napotkasz taki limit z dowolnego zaplecza.
hakre

2
@hakre: IIRC, 8K dla całej linii, licząc całe linie nagłówka (nazwy nagłówków, białe znaki i ładunki nagłówków).
vartec

Czy istnieje sposób zdefiniowania niestandardowego maksymalnego rozmiaru nagłówka?
Sudip Bolakhe

Prawdopodobnie usługi IIS są otwarte na 16 KB ze względu na wymagania protokołów SPNego i Kerberos i są często używane do „uwierzytelniania systemu Windows”.
Ronan Kerdudou,

220

Jak mówi vartec powyżej, specyfikacja HTTP nie określa limitu, jednak wiele serwerów domyślnie. Oznacza to, że praktycznie rzecz biorąc, dolna granica wynosi 8K . W przypadku większości serwerów limit ten dotyczy sumy wiersza żądania i WSZYSTKICH pól nagłówka (dlatego pliki cookie powinny być krótkie).

Warto zauważyć, że nginx domyślnie używa rozmiaru strony systemowej, który w większości systemów wynosi 4K. Możesz sprawdzić za pomocą tego małego programu:

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

Skompiluj z gcc -o pagesize pagesize.cnastępnie uruchom ./pagesize. Mój serwer Ubuntu z Linode sumiennie informuje mnie, że odpowiedź to 4k.


6
W przypadku apache2 długość adresu URL jest kontrolowana LimitRequestLinei LimitRequestFieldSizedotyczy każdego wiersza nagłówka HTTP osobno ... nie „suma ...”
Yves Martin

1
Ciasteczka mają oddzielną całkowity limit wielkości 4093 bajtów. stackoverflow.com/questions/640938/…
Jeff Lowery

25
Nie trzeba pisać kodu, aby uzyskać rozmiar strony. Z terminala: getconf
PAGESIZE

6
Prawdopodobnie uległo to zmianie od czasu napisania tej odpowiedzi, ale połączona strona nginx nie pasuje do odpowiedzi. Strona nginx wskazuje, że domyślny rozmiar bufora wynosi 8k i że żądanie może domyślnie używać 4 buforów (sam rozmiar bufora ogranicza rozmiar linii żądania i każdego nagłówka). To sugeruje, że nginx dopuszcza gdzieś pomiędzy 16-32k (zakładam, że jednej linii nie można podzielić na dwa bufory, więc bufory mogą nie być zapełnione do końca).
Lily Ballard,

dodając wartość dla apache 2.4, która pozostaje taka sama: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2.2.4: 8K
Med Ali Difallah

5

HTTP nie nakłada z góry określonego ograniczenia na długość każdego pola nagłówka ani na długość sekcji nagłówka jako całości, jak opisano w sekcji 2.5. W praktyce występują różne ograniczenia ad hoc dotyczące długości poszczególnych pól nagłówka, często w zależności od konkretnej semantyki pola.

Wartości nagłówka HTTP są ograniczone przez implementacje serwera. Specyfikacja HTTP nie ogranicza rozmiaru nagłówka.

Serwer, który odbiera pole nagłówka żądania lub zestaw pól, większe niż chce przetworzyć, MUSI odpowiedzieć odpowiednim kodem statusu 4xx (Błąd klienta). Zignorowanie takich pól nagłówka zwiększy podatność serwera na żądanie ataków przemytu (sekcja 9.5).

Większość serwerów zwróci 413 Entity Too Largelub usunie błąd 4xx, gdy to nastąpi.

Klient MOŻE odrzucić lub skrócić otrzymane pola nagłówka, które są większe niż klient chce przetworzyć, jeśli semantyka pola jest taka, że ​​upuszczone wartości można bezpiecznie zignorować bez zmiany ramek wiadomości lub semantyki odpowiedzi.

Nieograniczony rozmiar nagłówka HTTP utrzymuje serwer narażony na ataki i może obniżyć jego zdolność do obsługi ruchu organicznego.

Źródło


2

Oto limit najpopularniejszego serwera WWW

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

1

Odkryłem również, że w niektórych przypadkach przyczyną 502/400 w przypadku wielu nagłówków może być duża liczba nagłówków bez względu na rozmiar. z dokumentów

tune.http.maxhdr Ustawia maksymalną liczbę nagłówków w żądaniu. Gdy żądanie zawiera liczbę nagłówków większą niż ta wartość (w tym pierwszy wiersz), jest odrzucane z kodem statusu „400 Błędne żądanie”. Podobnie zbyt duże odpowiedzi są blokowane przez „502 Bad Gateway”. Wartość domyślna to 101, co wystarcza na wszystkie zastosowania, biorąc pod uwagę, że szeroko rozpowszechniony serwer Apache używa tego samego limitu. Przydatne może być zwiększenie tego limitu, aby tymczasowo zezwolić błędnej aplikacji na działanie do czasu jej naprawienia. Pamiętaj, że każdy nowy nagłówek zużywa 32 bity pamięci dla każdej sesji, więc nie zwiększaj tego limitu zbyt wysoko.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.