Plegado de líneas obsoleto
El plegado de líneas obsoleto es una característica de sintaxis en desuso originada en versiones antiguas del protocolo HTTP/1.1.
¿Qué es el plegado de líneas?
Los campos de encabezado HTTP normalmente se escriben en una sola línea. Sin embargo, en las especificaciones antiguas de HTTP/1.0 y las primeras versiones de HTTP/1.1, era posible distribuir un valor largo de encabezado en varias líneas. Esto se denominaba plegado de líneas.
El plegado de líneas funcionaba de la siguiente manera: después de colocar un CRLF (\r\n) al final de una línea, si la siguiente línea comenzaba con un carácter de espacio (SP) o tabulación (HTAB), las dos líneas se fusionaban en un único valor de encabezado.
El ejemplo anterior se interpretaría como:
¿Por qué se eliminó?
1. Vulnerabilidades de seguridad — Abría la puerta a ataques de HTTP Response Splitting e inyección de encabezados. Cuando diferentes analizadores interpretaban el plegado de líneas de manera distinta, surgían comportamientos inconsistentes entre sistemas.
2. Ambigüedad — Existían inconsistencias entre middleware, proxies y la capa de aplicación con respecto a cómo debían fusionarse los encabezados.
3. Redundancia — Dado que HTTP moderno no tiene un límite práctico en la longitud de los valores de encabezado, ya no existe ninguna necesidad de dividir valores largos entre varias líneas.
4. Complejidad del analizador — Exigir que cada biblioteca HTTP admitiera este caso extremo añadía una complejidad de código innecesaria.
Mientras que los navegadores modernos normalizan silenciosamente este formato, HttpClientCodec de Netty sigue estrictamente las especificaciones modernas de HTTP y rechaza dichos encabezados durante la decodificación. Como resultado, el proxy falló al decodificar los encabezados de respuesta upstream y nuestro cliente no pudo acceder al sitio web.
Solución
Se debe agregar un parámetro (http.proxy.allow.obsolete.header.line.unfolding) en el archivo http_proxy.properties como verdadero. El valor predeterminado era falso.
· Detecta encabezados de respuesta HTTP obs-folded (CRLF + espacio/tabulación)
· Los normaliza en un valor de encabezado de una sola línea
Este enfoque no deshabilita globalmente la validación de encabezados y solo aborda el problema específico de formato heredado. Además, si el proxy detecta encabezados obs-folded mientras esta función está deshabilitada, los registros incluirán el siguiente mensaje:
Intente agregar el parámetro (http.proxy.allow.obsolete.header.line.unfolding=verdadero) al archivo http_proxy.properties. Y reinicie el proxy.
Importante:
· Habilite este parámetro solo cuando sea estrictamente necesario.
· Para todos los demás clientes y entornos, esta función debe permanecer deshabilitada.
Por qué esta función no debe habilitarse de forma predeterminada
· Obs-fold es obsoleto y las especificaciones modernas de HTTP lo desaconsejan explícitamente
· Aceptarlo globalmente relajaría la validación estricta de HTTP
· Los servidores modernos siempre deberían enviar encabezados en un formato de una sola línea
· Esta función existe únicamente como una solución de compatibilidad para componentes upstream heredados o con comportamiento incorrecto