Maximal auf http-Header-Werten?

326

Gibt es eine akzeptierte maximal zulässige Größe für HTTP-Header? Wenn ja, was ist das? Wenn nicht, ist dies etwas Serverspezifisches oder ist der akzeptierte Standard, um Header jeder Größe zuzulassen?

Cory
quelle

Antworten:

316

Nein, HTTP definiert keine Begrenzung. Die meisten Webserver begrenzen jedoch die Größe der von ihnen akzeptierten Header. In Apache beträgt das Standardlimit beispielsweise 8 KB, in IIS 16 KB . Der Server gibt einen 413 Entity Too LargeFehler zurück, wenn die Größe der Header diesen Grenzwert überschreitet.

Verwandte Frage: Wie groß kann eine Benutzeragentenzeichenfolge werden?

vartec
quelle
10
Diese Antwort gibt die vom Server maximal akzeptierte Headergröße an. Aber wie groß ist die maximale Headergröße, die der Webserver (z. B. Apache) senden kann?
Pacerier
@ Pacerier: Das sind 8175 Bytes für Apache, aber ich suche immer noch. Erwarten Sie auch keine nützlichen Fehlermeldungen, wenn Sie von einem beliebigen Backend auf ein solches Limit stoßen.
hakre
2
@hakre: IIRC, 8 KB für die gesamte Zeile, wobei die gesamten Kopfzeilen gezählt werden (Namen der Kopfzeilen, Leerzeichen und Nutzdaten der Kopfzeilen).
Vartec
Gibt es eine Möglichkeit, die benutzerdefinierte maximale Größe des Headers zu definieren?
Sudip Bolakhe
Wahrscheinlich ist IIS aufgrund der SPNego- und Kerberos-Protokollanforderungen für 16 KB geöffnet und wird häufig für die "Windows-Authentifizierung" verwendet.
Ronan Kerdudou
220

Wie oben von vartec angegeben, definiert die HTTP-Spezifikation kein Limit, jedoch standardmäßig viele Server. Dies bedeutet praktisch, dass die Untergrenze 8 K beträgt . Bei den meisten Servern gilt diese Begrenzung für die Summe der Felder für die Anforderungszeile und ALLE Header (halten Sie Ihre Cookies also kurz).

Es ist erwähnenswert, dass nginx standardmäßig die Systemseitengröße verwendet, die auf den meisten Systemen 4 KB beträgt. Sie können mit diesem winzigen Programm überprüfen:

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

Kompilieren mit gcc -o pagesize pagesize.cdann ausführen ./pagesize. Mein Ubuntu-Server von Linode informiert mich pflichtbewusst über die Antwort 4k.

David Schoonover
quelle
6
Für Apache2 wird die URL-Länge von jeder HTTP-Headerzeile einzeln gesteuert LimitRequestLineund LimitRequestFieldSizegilt für diese ... nicht für die "Summe von ..."
Yves Martin,
1
Cookies haben eine separate Gesamtgrößengrenze von 4093 Bytes. stackoverflow.com/questions/640938/…
Jeff Lowery
25
Sie müssen keinen Code schreiben, um die Seitengröße zu erhalten. Von einem Terminal: getconf PAGESIZE
Ponytech
6
Dies hat sich wahrscheinlich geändert, seit diese Antwort geschrieben wurde, aber die verknüpfte Nginx-Seite stimmt nicht mit der Antwort überein. Die Nginx-Seite gibt an, dass die Standardpuffergröße 8 KB beträgt und dass die Anforderung standardmäßig 4 Puffer verwenden kann (die Puffergröße selbst begrenzt die Größe der Anforderungszeile und jedes einzelnen Headers). Dies deutet darauf hin, dass Nginx zwischen 16 und 32 KB zulässt (ich gehe davon aus, dass eine Zeile nicht auf zwei Puffer aufgeteilt werden kann, sodass die Puffer möglicherweise nicht vollständig gefüllt sind).
Lily Ballard
Hinzufügen des Wertes für Apache 2.4, der gleich bleibt: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah
5

HTTP begrenzt die Länge jedes Headerfelds oder die Länge des Headerabschnitts insgesamt nicht vordefiniert, wie in Abschnitt 2.5 beschrieben. In der Praxis gibt es verschiedene Ad-hoc-Einschränkungen für die Länge einzelner Headerfelder, häufig abhängig von der spezifischen Feldsemantik.

HTTP-Header-Werte werden durch Serverimplementierungen eingeschränkt. Die HTTP-Spezifikation schränkt die Headergröße nicht ein.

Ein Server, der ein Anforderungsheaderfeld oder eine Reihe von Feldern empfängt, die größer sind als er verarbeiten möchte, MUSS mit einem geeigneten 4xx-Statuscode (Clientfehler) antworten. Das Ignorieren solcher Headerfelder würde die Anfälligkeit des Servers erhöhen, Schmuggelangriffe anzufordern (Abschnitt 9.5).

Die meisten Server geben 413 Entity Too Largein diesem Fall einen entsprechenden 4xx-Fehler zurück.

Ein Client kann empfangene Headerfelder verwerfen oder abschneiden, die größer sind, als der Client verarbeiten möchte, wenn die Feldsemantik so ist, dass die abgelegten Werte sicher ignoriert werden können, ohne den Nachrichtenrahmen oder die Antwortsemantik zu ändern.

Die Größe des nicht begrenzten HTTP-Headers hält den Server Angriffen ausgesetzt und kann seine Kapazität zur Bereitstellung von organischem Datenverkehr verringern.

Quelle

realPK
quelle
2

Hier ist die Grenze der beliebtesten Webserver

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

Ich fand auch heraus, dass in einigen Fällen der Grund für 502/400 bei vielen Headern in einer großen Anzahl von Headern ohne Rücksicht auf die Größe liegen könnte. aus den Dokumenten

tune.http.maxhdr Legt die maximale Anzahl von Headern in einer Anforderung fest. Wenn eine Anforderung eine Anzahl von Headern enthält, die größer als dieser Wert sind (einschließlich der ersten Zeile), wird sie mit dem Statuscode "400 Bad Request" abgelehnt. Ebenso werden zu große Antworten mit "502 Bad Gateway" blockiert. Der Standardwert ist 101, was für alle Verwendungen ausreicht, wenn man bedenkt, dass der weit verbreitete Apache-Server dasselbe Limit verwendet. Es kann nützlich sein, diese Grenze weiter zu verschieben, damit eine fehlerhafte Anwendung vorübergehend funktioniert, wenn sie behoben ist. Beachten Sie, dass jeder neue Header für jede Sitzung 32 Bit Speicher benötigt. Schieben Sie diese Grenze also nicht zu hoch.

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

Shay Rybak
quelle