wake-up-neo.com

Maximal auf HTTP-Header-Werten?

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 der akzeptierte Standard, um Header beliebiger Größe zuzulassen?

296
Cory

Nein, HTTP definiert kein Limit. Die meisten Webserver begrenzen jedoch die Größe der akzeptierten Header. Zum Beispiel ist in Apache-Standardlimit 8 KB, in IIS sind es 16 KB . Der Server gibt den Fehler 413 Entity Too Large Zurück, wenn die Headergröße dieses Limit überschreitet.

Verwandte Frage: Wie groß kann ein Benutzeragenten-String werden?

288
vartec

Wie oben von vartec angegeben, gibt die HTTP-Spezifikation keine Begrenzung vor, viele Server tun dies jedoch standardmäßig. Dies bedeutet praktisch, dass die Untergrenze 8 K beträgt. Bei den meisten Servern gilt diese Beschränkung für die Summe aus der Anforderungszeile und [~ # ~] allen [~ # ~] -Headerfeldern (also halten Sie Ihre Cookies kurz).

Es ist erwähnenswert, dass nginx standardmäßig die System-Seitengröße verwendet, die auf den meisten Systemen 4 KB beträgt. Sie können mit diesem kleinen 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.c dann renne ./pagesize. Mein Ubuntu-Server von Linode teilt mir pflichtgemäß mit, dass die Antwort 4k ist.

208

HTTP legt keine vordefinierte Grenze für die Länge der einzelnen Headerfelder oder für die Länge des gesamten Headerabschnitts fest, wie in Abschnitt 2.5 beschrieben. In der Praxis gibt es verschiedene Ad-hoc-Beschränkungen für die Länge einzelner Headerfelder, die häufig von der spezifischen Feldsemantik abhängen.

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 Gruppe 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 Sicherheitsanfälligkeit des Servers für Anforderungsschmuggelangriffe erhöhen (Abschnitt 9.5).

Die meisten Server geben 413 Entity Too Large oder entsprechender 4xx-Fehler, wenn dies passiert.

Ein Client KANN empfangene Header-Felder verwerfen oder abschneiden, die größer sind als die vom Client zu verarbeitenden Felder, wenn die Feldsemantik so ist, dass die abgelegten Werte ohne Änderung des Nachrichtenrahmens oder der Antwortsemantik ignoriert werden können.

Durch die nicht begrenzte Größe des HTTP-Headers ist der Server Angriffen ausgesetzt und kann seine Kapazität für die Bereitstellung von organischem Datenverkehr verringern.

Quelle

4
realPK

Ich habe auch festgestellt, dass der Grund für 502/400 in einigen Fällen bei vielen Headern eine große Anzahl von Headern sein kann, ohne Rücksicht auf die Größe. aus den Dokumenten

tune.http.maxhdr Legt die maximale Anzahl von Headern in einer Anfrage fest. Wenn eine Anfrage mit einer Anzahl von Headern versehen ist, die diesen Wert überschreiten (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 Verwendungszwecke ausreicht, wenn man bedenkt, dass der weit verbreitete Apache-Server das gleiche Limit verwendet. Es kann nützlich sein, diese Grenze weiter zu verschieben, damit eine fehlerhafte Anwendung vorübergehend funktioniert, sobald sie behoben ist. Denken Sie daran, dass jeder neue Header für jede Sitzung 32 Bit Speicher belegt. Verschieben Sie dieses Limit also nicht zu hoch.

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

1
Shay Rybak