Maximum sur les valeurs d'en-tête http?

326

Existe-t-il une taille maximale autorisée pour les en-têtes HTTP? Si oui, c'est quoi? Sinon, est-ce quelque chose de spécifique au serveur ou la norme acceptée pour autoriser les en-têtes de toute taille?

Cory
la source

Réponses:

316

Non, HTTP ne définit aucune limite. Cependant, la plupart des serveurs Web limitent la taille des en-têtes qu'ils acceptent. Par exemple, dans Apache, la limite par défaut est de 8 Ko, dans IIS, elle est de 16 Ko . Le serveur renverra une 413 Entity Too Largeerreur si la taille des en-têtes dépasse cette limite.

Question connexe: quelle taille peut avoir une chaîne d'agent utilisateur?

vartec
la source
10
Cette réponse indique que la taille d'en-tête maximale acceptée par le serveur. Mais quelle est la taille maximale d'en-tête que le serveur Web (par exemple Apache) est capable d'envoyer?
Pacerier
@Pacerier: Cela fait 8175 octets pour Apache, mais je recherche toujours. Ne vous attendez pas non plus à recevoir des messages d'erreur utiles si vous rencontrez une telle limite de la part du backend.
hakre
2
@hakre: IIRC, 8K pour toute la ligne, en comptant toutes les lignes d'en-tête (noms des en-têtes, espace blanc et charges utiles des en-têtes).
vartec
Existe-t-il un moyen de définir la taille maximale personnalisée de l'en-tête?
Sudip Bolakhe
IIS est probablement ouvert à 16k en raison des exigences des protocoles SPNego et Kerberos, et ils sont souvent utilisés pour "l'authentification Windows".
Ronan Kerdudou
220

Comme le dit vartec ci-dessus, la spécification HTTP ne définit pas de limite, mais de nombreux serveurs le font par défaut. Cela signifie, pratiquement, que la limite inférieure est de 8K . Pour la plupart des serveurs, cette limite s'applique à la somme de la ligne de demande et de TOUS les champs d'en-tête (donc gardez vos cookies courts).

Il convient de noter que nginx utilise la taille de page système par défaut, qui est 4K sur la plupart des systèmes. Vous pouvez vérifier avec ce petit programme:

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

Compilez avec gcc -o pagesize pagesize.cpuis exécutez ./pagesize. Mon serveur Ubuntu de Linode m'informe consciencieusement que la réponse est 4k.

David Schoonover
la source
6
Pour apache2, la longueur de l'URL est contrôlée par LimitRequestLineet LimitRequestFieldSizes'applique à chaque ligne d'en-tête HTTP individuellement ... pas la "somme de ..."
Yves Martin
1
Les cookies ont une limite de taille totale distincte de 4093 octets. stackoverflow.com/questions/640938/…
Jeff Lowery
25
Pas besoin d'écrire du code pour obtenir la taille de la page. Depuis un terminal: getconf PAGESIZE
Ponytech
6
Cela a probablement changé depuis que cette réponse a été écrite, mais la page nginx liée ne correspond pas à la réponse. La page nginx indique que la taille de tampon par défaut est 8 Ko et que la demande peut utiliser 4 tampons par défaut (la taille de tampon elle-même limite la taille de la ligne de demande et de chaque en-tête individuel). Cela suggère donc que nginx autorise quelque part entre 16 et 32 ​​Ko (je suppose qu'une ligne ne peut pas être divisée en deux tampons, donc les tampons peuvent ne pas être remplis complètement).
Lily Ballard
ajout de la valeur sur apache 2.4 qui reste la même: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah
5

HTTP ne place pas de limite prédéfinie sur la longueur de chaque champ d'en-tête ou sur la longueur de la section d'en-tête dans son ensemble, comme décrit dans la section 2.5. On trouve en pratique diverses limitations ad hoc sur la longueur de champ d'en-tête individuel, souvent en fonction de la sémantique de champ spécifique.

Les valeurs d'en-tête HTTP sont limitées par les implémentations de serveur. La spécification HTTP ne limite pas la taille de l'en-tête.

Un serveur qui reçoit un champ d'en-tête de demande, ou un ensemble de champs, plus grand qu'il ne souhaite traiter DOIT répondre avec un code d'état 4xx (erreur client) approprié. Ignorer ces champs d'en-tête augmenterait la vulnérabilité du serveur à la demande d'attaques de contrebande (section 9.5).

La plupart des serveurs renvoient 413 Entity Too Largeou une erreur 4xx appropriée lorsque cela se produit.

Un client PEUT éliminer ou tronquer les champs d'en-tête reçus qui sont plus grands que le client souhaite traiter si la sémantique des champs est telle que la ou les valeurs supprimées peuvent être ignorées en toute sécurité sans modifier le cadrage du message ou la sémantique des réponses.

La taille d'en-tête HTTP non plafonnée maintient le serveur exposé aux attaques et peut réduire sa capacité à servir le trafic organique.

La source

realPK
la source
2

Voici la limite du serveur Web le plus populaire

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

J'ai également constaté que, dans certains cas, la raison de 502/400 dans le cas de nombreux en-têtes pouvait être due à un grand nombre d'en-têtes sans égard à la taille. des documents

tune.http.maxhdr Définit le nombre maximal d'en-têtes dans une demande. Lorsqu'une demande est livrée avec un nombre d'en-têtes supérieur à cette valeur (y compris la première ligne), elle est rejetée avec un code d'état "400 Bad Request". De même, les réponses trop importantes sont bloquées avec "502 Bad Gateway". La valeur par défaut est 101, ce qui est suffisant pour toutes les utilisations, étant donné que le serveur Apache largement déployé utilise la même limite. Il peut être utile de pousser cette limite plus loin pour permettre temporairement à une application de bug de fonctionner au moment où elle est corrigée. Gardez à l'esprit que chaque nouvel en-tête consomme 32 bits de mémoire pour chaque session, alors ne poussez pas cette limite trop haut.

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

Shay Rybak
la source