Qual é o tamanho máximo possível de uma string de consulta?

559

É dependente do navegador? Além disso, diferentes pilhas da Web têm limites diferentes para a quantidade de dados que eles podem obter da solicitação?

Brian Sullivan
fonte
você também pode verificar este stackoverflow.com/questions/417142/…
Xinus 13/12/2009
É apenas para solicitações GET! O tamanho máximo das solicitações POST (com ou sem multipart / form-data) é aqui desconhecido!
peterh - Restabelece Monica

Respostas:

996

A RFC 2616 (Protocolo de transferência de hipertexto - HTTP / 1.1) afirma que não há limite para o comprimento de uma sequência de consulta (seção 3.2.1). A RFC 3986 (URI) também afirma que não há limite, mas indica que o nome do host está limitado a 255 caracteres devido às limitações do DNS (seção 2.3.3).

Embora as especificações não especifiquem tamanho máximo, os limites práticos são impostos pelo navegador da Web e pelo software do servidor. Com base em pesquisas que, infelizmente, não estão mais disponíveis em seu site original (isso leva a um site de empréstimo aparentemente obscuro), mas que ainda pode ser encontrado no Internet Archive Of Boutell.com :

  • Microsoft Internet Explorer (Navegador) A
    Microsoft afirma que o tamanho máximo de uma URL no Internet Explorer é de 2.083 caracteres, com não mais de 2.048 caracteres na parte do caminho da URL. Tentativas de usar URLs maiores que isso produziram uma mensagem de erro clara no Internet Explorer.

  • Microsoft Edge (navegador)
    O limite parece estar em torno de 81578 caracteres. Consulte Limitação de comprimento de URL do Microsoft Edge

  • Chrome
    Ela pára de exibir a URL depois de 64k caracteres, mas pode servir mais de 100 mil caracteres. Nenhum teste adicional foi feito além disso.

  • Firefox (Navegador)
    Após 65.536 caracteres, a barra de localização não exibe mais o URL no Windows Firefox 1.5.x. No entanto, URLs mais longos funcionarão. Nenhum teste adicional foi realizado após 100.000 caracteres.

  • Safari (Navegador)
    Pelo menos 80.000 caracteres funcionarão. O teste não foi tentado além disso.

  • Opera (Navegador)
    Pelo menos 190.000 caracteres funcionarão. Interrompeu o teste após 190.000 caracteres. O Opera 9 para Windows continuou exibindo um URL totalmente editável, copiável e colável na barra de localização, mesmo com 190.000 caracteres.

  • Apache (servidor) As
    primeiras tentativas de medir o tamanho máximo da URL nos navegadores da Web atingiram um limite de aproximadamente 4.000 caracteres, após o qual o Apache produz um erro "413 Entity Too Large". Foi usada a versão atual atualizada do Apache encontrada no Red Hat Enterprise Linux 4. A documentação oficial do Apache menciona apenas um limite de 8.192 bytes em um campo individual em uma solicitação.

  • Microsoft Internet Information Server (Servidor)
    O limite padrão é 16.384 caracteres (sim, o servidor da Microsoft aceita URLs mais longos que o navegador da Microsoft). Isso é configurável.

  • HTTP Perl :: Daemon (Servidor)
    Até 8.000 bytes funcionarão. Aqueles que estão construindo servidores de aplicativos da web com o módulo HTTP :: Daemon do Perl encontrarão um limite de 16.384 bytes no tamanho combinado de todos os cabeçalhos de solicitação HTTP. Isso não inclui dados do formulário do método POST, upload de arquivos etc., mas inclui o URL. Na prática, isso resultou em um erro 413 quando um URL era significativamente maior que 8.000 caracteres. Essa limitação pode ser facilmente removida. Procure por todas as ocorrências de 16x1024 no Daemon.pm e substitua-as por um valor maior. Obviamente, isso aumenta sua exposição a ataques de negação de serviço.

Robert Cartaino
fonte
8
Por que você não diz o número da versão também em vez de "Microsoft Internet Explorer (Navegador)"?
LCJ 28/05
5
Parece que o limite padrão do IIS na string de consulta é significativamente menor que 16.384 caracteres - citado em 2048 aqui: iis.net/configreference/system.webserver/security/…
JTech
Eu acho que você fez um tipo e as limitações de DNS são discutidas na seção "3.2.2. Host" do RFC3986, e não no 2.2.3. "Os produtores de URI devem usar nomes que estejam em conformidade com a sintaxe do DNS, mesmo quando o uso do DNS não for aparente imediatamente, e devem limitar esses nomes a não mais que 255 caracteres."
Craig Hicks
Causas java.lang.IllegalArgumentException: Request header is too largeno servidor de aplicativos de inicialização por tomcat spring.
Paramvir Singh Karwal
12

Embora oficialmente não haja limite especificado pelo RFC 2616, muitos protocolos e recomendações de segurança afirmam que maxQueryStrings em um servidor deve ser definido como um limite máximo de caracteres de 1024. Enquanto toda a URL, incluindo a querystring, deve ser definida como um máximo de 2048 personagens. Isso evita a vulnerabilidade DDOS da Solicitação HTTP Lenta em um servidor da web. Isso geralmente aparece como uma vulnerabilidade no Qualys Web Application Scanner e em outros scanners de segurança.

Consulte o código de exemplo abaixo para servidores Windows IIS com Web.config:

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

Isso também funcionaria no nível do servidor usando machine.config.

Nota: A limitação da seqüência de caracteres da consulta e do comprimento da URL pode não impedir completamente o ataque DDOS de solicitações HTTP lentas, mas é uma etapa que você pode executar para evitá-lo.

TroySteven
fonte
2
E agora eu tenho um motivo para dizer aos engenheiros de back-end que não aceitaremos uma lista de UUIDs de 36 caracteres na queryParams de uma solicitação GET. Obrigado!
Mordred
1

Diferentes pilhas da web suportam diferentes comprimentos de solicitações http. Sei por experiência própria que as primeiras pilhas do Safari suportavam apenas 4000 caracteres e, portanto, tinham dificuldade em lidar com as páginas ASP.net por causa do USER-STATE. Isso é válido para o POST, então você teria que verificar o navegador e ver qual é o limite da pilha. Eu acho que você pode atingir um limite, mesmo em navegadores mais recentes. Não me lembro, mas um deles (IE6, acho) tinha um limite de 16 bits, 32.768 ou algo assim.

kdevine
fonte