Quelle est la longueur maximale possible d'une chaîne de requête?

559

Est-ce que cela dépend du navigateur? En outre, les différentes piles Web ont-elles différentes limites quant à la quantité de données qu'elles peuvent obtenir de la demande?

Brian Sullivan
la source
vous pouvez également consulter ce stackoverflow.com/questions/417142/…
Xinus
C'est uniquement pour les demandes GET! La taille maximale des requêtes POST (avec ou sans multipart / form-data) est ici inconnue!
peterh

Réponses:

997

La RFC 2616 (Hypertext Transfer Protocol - HTTP / 1.1) indique qu'il n'y a pas de limite à la longueur d'une chaîne de requête (section 3.2.1). La RFC 3986 (Uniform Resource Identifier - URI) indique également qu'il n'y a pas de limite, mais indique que le nom d'hôte est limité à 255 caractères en raison de limitations DNS (section 2.3.3).

Bien que les spécifications ne spécifient aucune longueur maximale, des limites pratiques sont imposées par le navigateur Web et le logiciel serveur. Sur la base de recherches qui ne sont malheureusement plus disponibles sur son site d'origine (cela conduit à un site de prêt apparemment louche) mais qui peuvent toujours être trouvées sur Internet Archive Of Boutell.com :

  • Microsoft Internet Explorer (navigateur)
    Microsoft indique que la longueur maximale d'une URL dans Internet Explorer est de 2 083 caractères, avec pas plus de 2 048 caractères dans la partie chemin de l'URL. Les tentatives d'utilisation d'URL plus longues que cela ont généré un message d'erreur clair dans Internet Explorer.

  • Microsoft Edge (navigateur)
    La limite semble être d'environ 81578 caractères. Voir Limite de longueur d'URL de Microsoft Edge

  • Chrome
    Il cesse d' afficher l'URL après 64k caractères, mais peut servir plus de 100k caractères. Aucun autre test n'a été effectué au-delà de cela.

  • Firefox (navigateur)
    Après 65 536 caractères, la barre d'emplacement n'affiche plus l'URL dans Windows Firefox 1.5.x. Cependant, des URL plus longues fonctionneront. Aucun autre test n'a été effectué après 100 000 caractères.

  • Safari (navigateur)
    Au moins 80 000 caractères fonctionneront. Le test n'a pas été essayé au-delà de cela.

  • Opera (navigateur)
    Au moins 190 000 caractères fonctionneront. Arrêt des tests après 190 000 caractères. Opera 9 pour Windows a continué d'afficher une URL entièrement modifiable, copiable et collable dans la barre d'emplacement, même à 190 000 caractères.

  • Apache (serveur)
    Les premières tentatives de mesure de la longueur d'URL maximale dans les navigateurs Web se sont heurtées à une limite de longueur d'URL de serveur d'environ 4 000 caractères, après quoi Apache génère une erreur «413 Entity Too Large». La version actuelle d'Apache mise à jour trouvée dans Red Hat Enterprise Linux 4 a été utilisée. La documentation officielle Apache mentionne uniquement une limite de 8 192 octets sur un champ individuel dans une demande.

  • Microsoft Internet Information Server (Server)
    La limite par défaut est de 16 384 caractères (oui, le serveur Web de Microsoft accepte des URL plus longues que le navigateur Web de Microsoft). C'est configurable.

  • Perl HTTP :: Daemon (Server)
    Jusqu'à 8 000 octets fonctionneront. Ceux qui construisent des serveurs d'applications Web avec le module HTTP :: Daemon de Perl rencontreront une limite de 16 384 octets sur la taille combinée de tous les en-têtes de requête HTTP. Cela n'inclut pas les données de formulaire de la méthode POST, les téléchargements de fichiers, etc., mais il inclut l'URL. En pratique, cela entraînait une erreur 413 lorsqu'une URL dépassait considérablement 8 000 caractères. Cette limitation peut être facilement supprimée. Recherchez toutes les occurrences de 16x1024 dans Daemon.pm et remplacez-les par une valeur supérieure. Bien sûr, cela augmente votre exposition aux attaques par déni de service.

Robert Cartaino
la source
8
Pourquoi ne dites-vous pas également le numéro de version au lieu de «Microsoft Internet Explorer (navigateur)»?
LCJ
5
Il semble que la limite IIS par défaut sur la chaîne de requête soit nettement inférieure à 16 384 caractères - cité comme 2048 ici: iis.net/configreference/system.webserver/security/…
JTech
Je pense que vous avez fait un type et les limitations DNS sont discutées dans la section "3.2.2. Host" de RFC3986, pas 2.2.3. "Les producteurs d'URI doivent utiliser des noms conformes à la syntaxe DNS, même lorsque l'utilisation du DNS n'est pas immédiatement apparente, et doivent limiter ces noms à 255 caractères au maximum."
Craig Hicks
Causes java.lang.IllegalArgumentException: Request header is too largesur le serveur d'applications Tomcat Spring Boot.
Paramvir Singh Karwal
12

Bien qu'officiellement aucune limite ne soit spécifiée par la RFC 2616, de nombreux protocoles et recommandations de sécurité stipulent que maxQueryStrings sur un serveur doit être défini sur une limite de caractères maximale de 1024. Alors que l'URL entière, y compris la chaîne de requête, doit être définie sur un maximum de 2048 personnages. Ceci permet d'éviter la vulnérabilité DDOS de requête HTTP lente sur un serveur Web. Cela se présente généralement comme une vulnérabilité sur le scanner d'application Web Qualys et d'autres scanners de sécurité.

Veuillez consulter l'exemple de code ci-dessous pour les serveurs Windows IIS avec Web.config:

<system.webServer>
<security>
    <requestFiltering>
        <requestLimits maxQueryString="1024" maxUrl="2048">
           <headerLimits>
              <add header="Content-type" sizeLimit="100" />
           </headerLimits>
        </requestLimits>
     </requestFiltering>
</security>
</system.webServer>

Cela fonctionnerait également au niveau du serveur en utilisant machine.config.

Remarque: Limiter la chaîne de requête et la longueur de l'URL peut ne pas empêcher complètement l'attaque DDOS des requêtes HTTP lentes, mais c'est une étape que vous pouvez prendre pour l'empêcher.

TroySteven
la source
2
Et maintenant, j'ai une raison pour laquelle je peux dire aux ingénieurs du backend que nous n'accepterons pas une liste de cent 36 UUID de caractères dans le queryParams d'une requête GET. Merci!
Mordred
1

Différentes piles Web prennent en charge différentes longueurs de requêtes http. Je sais par expérience que les premières piles de Safari ne prenaient en charge que 4 000 caractères et avaient donc du mal à gérer les pages ASP.net en raison de l'état utilisateur. C'est même pour POST, vous devrez donc vérifier le navigateur et voir quelle est la limite de pile. Je pense que vous pouvez atteindre une limite même sur les nouveaux navigateurs. Je ne me souviens pas mais l'un d'eux (IE6, je pense) avait une limite de 16 bits, 32 768 ou quelque chose.

kdevine
la source