web-dev-qa-db-fra.com

Existe-t-il une limite de longueur d'en-tête HTTP pratique?

J'ai une application Web qui ajoute des informations contextuelles aux objets XmlHttpRequest à l'aide de l'API setRequestHeader . J'utilise un nom d'en-tête personnalisé (par exemple X-Foo) et une valeur structurée JSON . Il ne fait pas partie de l'URL QueryString ou du corps POST car il s'agit de métadonnées sur la demande.

Existe-t-il une limite de taille pratique pour la valeur d'en-tête? Si mon JSON est tronqué, il devient impossible à analyser. Je suis plus préoccupé par les limites dans Apache 2, Tomcat 6 et IIS 7. J'ai fait une recherche Google pour la limite de longueur d'en-tête http , mais la plupart des résultats semblent datés. Il y a quelques commentaires pertinents dans Quelle taille peut avoir une chaîne d'agent utilisateur? mais pas aussi spécifique que je le voudrais.

Edit: Je viens de rencontrer cette question similaire - Maximum sur les valeurs d'en-tête http?

70
Kevin Hakanson

Oui, mais les limites sont configurables et dépendent de la plate-forme. Par exemple, Tomcat a une limite par défaut de 8 Ko. Je crois que IIS 6, je ne suis pas sûr de IIS 7, a une limite de 16 Ko. Je l'ai rencontré lors de l'utilisation de l'authentification Windows intégrée pour plusieurs sites Web. Il s'avère que mon jeton de sécurité était trop volumineux lorsqu'il était codé dans l'en-tête. Heureusement, ils sont configurables. Les paramètres de registre pour IIS peuvent être trouvés sur http://support.Microsoft.com/kb/820129 . Je pense que les paramètres clés à modifier sont MaxFieldLength (par taille d'en-tête) et MaxRequestBytes (taille totale de la demande).

50
tvanfosson

Bien que chaque logiciel de serveur Web ait certaines limites, il existe une différence entre les champs d'en-tête ligne de demande HTTP plus ou pour chaque champ d'en-tête.

Voici un résumé:

  • Apache 1. , 2. , 2.2 , 2. : 8190 octets (pour chaque champ d'en-tête)
  • IIS:
    • 4. : 2097152 octets (pour la ligne de demande plus les champs d'en-tête)
    • 5. : 131072 octets , 16384 octets avec Windows 2000 Service Pack 4 (pour la ligne de demande plus les champs d'en-tête)
    • 6. : 16384 octets (pour chaque champ d'en-tête)
  • Matou:
    • 5.5.x / 6.0.x : 49152 octets (pour la ligne de demande plus les champs d'en-tête )
    • 7.0.x : 8190 octets (pour la ligne de demande plus les champs d'en-tête)

Pour conclure: pour être acceptée par tous les serveurs Web ci-dessus, la ligne de demande d'une requête ainsi que les champs d'en-tête ne doivent pas dépasser 8190 octets . C'est aussi la limite pour chaque champ d'en-tête (effectivement encore moins).

56
Gumbo

Pour Apache, j'ai trouvé cet article Server Limits for Apache Security qui répertorie ces directives:

  # allow up to 100 headers in a request
  LimitRequestFields 100
  # each header may be up to 8190 bytes long
  LimitRequestFieldsize 8190

Pour Nginx, la directive large_client_header_buffers de HttpCoreModule contrôle ceci:

La ligne d'en-tête de requête la plus longue ne doit pas non plus dépasser la taille d'un tampon, sinon le client obtient l'erreur "Bad request" (400).

Par défaut, la taille d'un tampon est égale à la taille de la page, selon la plate-forme, ce 4K ou 8K

14
Kevin Hakanson

Bien que vous puissiez configurer le serveur, il est peu probable que vous puissiez vraiment configurer tout le chemin à travers les pare-feu, les équilibreurs de charge et les proxys. Garder la taille de l'en-tête petite éloigne les problèmes.

4
Lothar

Le Flash Media Server 4.5 a une limite de longueur d'en-tête par défaut très courte qui peut simplement empêcher le serveur de répondre, en particulier dans les cas où la charge des cookies est modérée.

Voir: Configuration et administration de Flash Media Server 4.5: Configuration du serveur Configuration du serveur HTTP Apache: Spécifiez la longueur maximale de la ligne d'en-tête HTTP

Dans le fichier Flash Media Server Adaptor.xml, l'élément MaxHeaderLineLength détermine la taille de l'en-tête HTTP que le serveur peut gérer. La valeur par défaut de MaxHeaderLineLength est de 1024 octets. Certains navigateurs envoient un en-tête supérieur à 1024 octets. Dans ce scénario, Apache renvoie une réponse vide. Pour résoudre ce problème, configurez MaxHeaderLineLength sur 8192.

Remarque: Par défaut, la limite de taille de l'en-tête Apache HTTP est de 8 Ko (8190 octets plus un retour chariot).

Mettre ceci ici au cas où la limite de taille d'en-tête sur Flash Media Server mord quelqu'un d'autre.

3
artlung