Qual è la lunghezza massima possibile di una stringa di query?


Risposte:


997

RFC 2616 (Hypertext Transfer Protocol - HTTP / 1.1) afferma che non vi sono limiti alla lunghezza di una stringa di query (sezione 3.2.1). RFC 3986 (Uniform Resource Identifier - URI) afferma inoltre che non esiste alcun limite, ma indica che il nome host è limitato a 255 caratteri a causa delle limitazioni DNS (sezione 2.3.3).

Mentre le specifiche non specificano alcuna lunghezza massima, i limiti pratici sono imposti dal browser Web e dal software server. Sulla base di una ricerca che purtroppo non è più disponibile sul sito originale (porta a un sito di prestito apparente losco) ma che può ancora essere trovato su Internet Archive Of Boutell.com :

  • Microsoft Internet Explorer (Browser)
    Microsoft afferma che la lunghezza massima di un URL in Internet Explorer è di 2.083 caratteri, con non più di 2.048 caratteri nella parte del percorso dell'URL. I tentativi di utilizzare URL più lunghi di questo hanno prodotto un chiaro messaggio di errore in Internet Explorer.

  • Microsoft Edge (Browser)
    Il limite sembra essere di circa 81578 caratteri. Vedi Limitazione della lunghezza dell'URL di Microsoft Edge

  • Chrome
    Smette di visualizzare l'URL dopo 64k caratteri, ma può servire più di 100k caratteri. Non sono stati effettuati ulteriori test oltre a questo.

  • Firefox (Browser)
    Dopo 65.536 caratteri, la barra degli indirizzi non visualizza più l'URL in Windows Firefox 1.5.x. Tuttavia, funzioneranno URL più lunghi. Non sono stati effettuati ulteriori test dopo 100.000 caratteri.

  • Safari (Browser)
    Funzioneranno almeno 80.000 caratteri. Il test non è stato provato oltre questo.

  • Opera (Browser)
    Funzioneranno almeno 190.000 personaggi. Test interrotto dopo 190.000 caratteri. Opera 9 per Windows ha continuato a visualizzare un URL completamente modificabile, copiabile e incollabile nella barra degli indirizzi anche a 190.000 caratteri.

  • Apache (Server)
    I primi tentativi di misurare la lunghezza massima dell'URL nei browser Web si sono imbattuti in un limite di lunghezza dell'URL del server di circa 4.000 caratteri, dopodiché Apache produce un errore "413 Entità troppo grande". È stata utilizzata l'attuale build Apache aggiornata trovata in Red Hat Enterprise Linux 4. La documentazione ufficiale di Apache menziona solo un limite di 8.192 byte su un singolo campo in una richiesta.

  • Microsoft Internet Information Server (Server)
    Il limite predefinito è 16.384 caratteri (sì, il server Web di Microsoft accetta URL più lunghi del browser Web di Microsoft). Questo è configurabile

  • Perl HTTP :: Daemon (Server) Funzioneranno
    fino a 8.000 byte. Coloro che costruiscono server di applicazioni Web con il modulo HTTP :: Daemon di Perl incontreranno un limite di 16.384 byte sulla dimensione combinata di tutte le intestazioni di richiesta HTTP. Ciò non include i dati dei moduli del metodo POST, i caricamenti di file, ecc., Ma include l'URL. In pratica, ciò ha comportato un errore 413 quando un URL era significativamente più lungo di 8000 caratteri. Questa limitazione può essere facilmente rimossa. Cerca tutte le occorrenze di 16x1024 in Daemon.pm e sostituiscile con un valore maggiore. Naturalmente, ciò aumenta la tua esposizione agli attacchi denial of service.


8
Perché non dici anche il numero di versione invece di "Microsoft Internet Explorer (Browser)"?
LCJ,

5
Sembra che il limite IIS predefinito sulla stringa di query sia significativamente inferiore a 16.384 caratteri - citato qui come 2048: iis.net/configreference/system.webserver/security/…
JTech


Penso che tu abbia creato un tipo e le limitazioni DNS siano discusse nella sezione "3.2.2. Host" di RFC3986, non 2.2.3. "I produttori di URI dovrebbero usare nomi conformi alla sintassi DNS, anche quando l'uso del DNS non è immediatamente evidente e dovrebbero limitare questi nomi a non più di 255 caratteri di lunghezza."
Craig Hicks,

Cause java.lang.IllegalArgumentException: Request header is too largesul server delle applicazioni Tomcat Spring Boot.
Paramvir Singh Karwal,

12

Sebbene ufficialmente non vi siano limiti specificati da RFC 2616, molti protocolli e raccomandazioni di sicurezza affermano che maxQueryStrings su un server deve essere impostato su un limite massimo di caratteri di 1024. Mentre l'intero URL, incluso il querystring, deve essere impostato su un massimo di 2048 personaggi. Questo serve a prevenire la vulnerabilità DDOS richiesta HTTP lenta su un server web. Questo si presenta in genere come una vulnerabilità dello scanner di applicazioni Web Qualys e di altri scanner di sicurezza.

Vedere il codice di esempio di seguito per i server Windows IIS con Web.config:

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

Funzionerebbe anche a livello di server usando machine.config.

Nota: la limitazione della stringa di query e della lunghezza dell'URL potrebbe non impedire completamente l'attacco DDOS delle richieste HTTP lente ma è un passaggio che è possibile eseguire per impedirlo.


2
E ora ho una ragione per cui posso dire agli ingegneri di backend che non accetteremo un elenco di UUID da cento 36 caratteri nei queryParams di una richiesta GET. Grazie!
Mordred il

1

Diversi stack Web supportano lunghezze diverse di richieste http. So per esperienza che le prime pile di Safari supportavano solo 4000 caratteri e quindi avevano difficoltà a gestire le pagine ASP.net a causa dello STATO UTENTE. Questo è anche per POST, quindi dovresti controllare il browser e vedere qual è il limite di stack. Penso che potresti raggiungere un limite anche sui browser più recenti. Non ricordo, ma uno di loro (IE6, credo) aveva un limite di 16 bit, 32.768 o qualcosa del genere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.