¿Cuál es la longitud máxima posible de una cadena de consulta?

559

¿Es dependiente del navegador? Además, ¿las diferentes pilas web tienen límites diferentes sobre la cantidad de datos que pueden obtener de la solicitud?

Brian Sullivan
fuente
también puede consultar este stackoverflow.com/questions/417142/…
Xinus
¡Es solo para solicitudes GET! ¡Aquí se desconoce el tamaño máximo de las solicitudes POST (con o sin datos multiparte / formulario)!
peterh - Restablece a Mónica el

Respuestas:

997

RFC 2616 (Protocolo de transferencia de hipertexto - HTTP / 1.1) establece que no hay límite para la longitud de una cadena de consulta (sección 3.2.1). RFC 3986 (Identificador uniforme de recursos - URI) también establece que no hay límite, pero indica que el nombre de host está limitado a 255 caracteres debido a limitaciones de DNS (sección 2.3.3).

Si bien las especificaciones no especifican ninguna longitud máxima, el navegador web y el software del servidor imponen límites prácticos. Basado en una investigación que desafortunadamente ya no está disponible en su sitio original (conduce a un sitio sospechoso de préstamo) pero que todavía se puede encontrar en Internet Archive Of Boutell.com :

  • Microsoft Internet Explorer (navegador)
    Microsoft afirma que la longitud máxima de una URL en Internet Explorer es de 2,083 caracteres, con no más de 2,048 caracteres en la porción de ruta de la URL. Los intentos de usar URL más largas que esto produjeron un mensaje de error claro en Internet Explorer.

  • Microsoft Edge (navegador)
    El límite parece ser de alrededor de 81578 caracteres. Ver limitación de longitud de URL de Microsoft Edge

  • Chrome
    Deja de mostrar la URL después de 64k caracteres, pero puede servir más de 100k caracteres. No se realizaron más pruebas más allá de eso.

  • Firefox (navegador)
    Después de 65.536 caracteres, la barra de ubicación ya no muestra la URL en Windows Firefox 1.5.x. Sin embargo, las URL más largas funcionarán. No se realizaron más pruebas después de 100,000 caracteres.

  • Safari (navegador)
    Al menos 80,000 caracteres funcionarán. La prueba no se intentó más allá de eso.

  • Opera (navegador)
    Al menos 190,000 caracteres funcionarán. Dejó de probar después de 190,000 caracteres. Opera 9 para Windows continuó mostrando una URL totalmente editable, copiable y pegable en la barra de ubicación, incluso con 190,000 caracteres.

  • Apache (Servidor) Los
    primeros intentos de medir la longitud máxima de URL en los navegadores web se toparon con un límite de longitud de URL de servidor de aproximadamente 4.000 caracteres, después de lo cual Apache produce un error "413 Entity Too Large". Se utilizó la compilación Apache actualizada actual que se encuentra en Red Hat Enterprise Linux 4. La documentación oficial de Apache solo menciona un límite de 8,192 bytes en un campo individual en una solicitud.

  • Servidor de información de Internet de Microsoft (servidor)
    El límite predeterminado es de 16.384 caracteres (sí, el servidor web de Microsoft acepta URL más largas que el navegador web de Microsoft). Esto es configurable.

  • Perl HTTP :: Daemon (Servidor)
    Hasta 8,000 bytes funcionarán. Aquellos que construyan servidores de aplicaciones web con el módulo HTTP :: Daemon de Perl encontrarán un límite de 16,384 bytes en el tamaño combinado de todos los encabezados de solicitud HTTP. Esto no incluye datos de formularios del método POST, cargas de archivos, etc., pero sí incluye la URL. En la práctica, esto resultó en un error 413 cuando una URL era significativamente más larga que 8,000 caracteres. Esta limitación se puede eliminar fácilmente. Busque todas las apariciones de 16x1024 en Daemon.pm y reemplácelas por un valor mayor. Por supuesto, esto aumenta su exposición a los ataques de denegación de servicio.

Robert Cartaino
fuente
8
¿Por qué no dice también el número de versión en lugar de "Microsoft Internet Explorer (navegador)"?
LCJ
55
Parece que el límite predeterminado de IIS en la Cadena de consulta es significativamente menor de 16,384 caracteres, citado como 2048 aquí: iis.net/configreference/system.webserver/security/…
JTech
Creo que hizo un tipo y las limitaciones de DNS se tratan en la sección "3.2.2. Host" de RFC3986, no 2.2.3. "Los productores de URI deberían usar nombres que se ajusten a la sintaxis de DNS, incluso cuando el uso de DNS no sea evidente de inmediato, y deberían limitar estos nombres a no más de 255 caracteres de longitud".
Craig Hicks
Causas java.lang.IllegalArgumentException: Request header is too largeen el servidor de aplicaciones de arranque de tomcat spring.
Paramvir Singh Karwal
12

Aunque oficialmente no hay un límite especificado por RFC 2616, muchos protocolos y recomendaciones de seguridad establecen que maxQueryStrings en un servidor debe establecerse en un límite máximo de caracteres de 1024. Mientras que la URL completa, incluida la cadena de consulta, debe establecerse en un máximo de 2048 caracteres. Esto es para evitar la vulnerabilidad Slow HTTP Request DDOS en un servidor web. Esto generalmente aparece como una vulnerabilidad en el analizador de aplicaciones web de Qualys y otros escáneres de seguridad.

Consulte el siguiente código de ejemplo para los servidores IIS de Windows 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>

Esto también funcionaría en un nivel de servidor usando machine.config.

Nota: Limitar la cadena de consulta y la longitud de la URL puede no prevenir completamente el ataque DDOS de Solicitudes HTTP lentas, pero es un paso que puede tomar para evitarlo.

TroySteven
fuente
2
Y ahora tengo una razón por la que puedo decirles a los ingenieros de backend que no aceptaremos una lista de ciento UUID de 36 caracteres en los queryParams de una solicitud GET. ¡Gracias!
Mordred
1

Las diferentes pilas web admiten diferentes longitudes de solicitudes http. Sé por experiencia que las primeras pilas de Safari solo admitían 4000 caracteres y, por lo tanto, tenían dificultades para manejar páginas ASP.net debido al ESTADO DEL USUARIO. Esto es incluso para POST, por lo que tendría que verificar el navegador y ver cuál es el límite de la pila. Creo que puede llegar a un límite incluso en los navegadores más nuevos. No puedo recordar, pero uno de ellos (IE6, creo) tenía un límite de 16 bits, 32.768 o algo así.

kdevine
fuente