El código de estado HTTP 431, también conocido como “Campos de Encabezado de Solicitud Demasiado Grandes”, es un error del lado del cliente que indica que el servidor se niega a procesar una solicitud porque sus campos de encabezado son demasiado grandes. Este error puede ser causado por el tamaño total de los encabezados o porque un solo campo de encabezado excede el tamaño permitido.
El código de estado HTTP 431 se introdujo por primera vez en RFC 6585, publicado en abril de 2012. Esto fue parte de un esfuerzo para estandarizar respuestas adicionales para HTTP/1.1, abordando problemas que no estaban cubiertos por los códigos de estado existentes en ese momento. Introducir este código de error específico fue crucial para mejorar la seguridad del servidor y prevenir ataques maliciosos como los ataques de desbordamiento de búfer, que podrían explotar encabezados grandes.
Comprensión del Error HTTP 431
Cuando ocurre un error 431, significa que el servidor ha bloqueado la solicitud del cliente debido a campos de encabezado excesivamente grandes. Cada servidor tiene sus propias políticas regarding el tamaño máximo permitido para los campos de encabezado HTTP, lo que ayuda a proteger contra ataques de denegación de servicio.
Síntomas Comunes de Errores HTTP 431
- El tamaño total de los encabezados de solicitud es demasiado grande: Este error ocurre cuando el tamaño acumulado de todos los encabezados de solicitud excede el límite.
- El tamaño de los campos de encabezado individuales es demasiado grande: En este caso, un solo campo de encabezado es demasiado grande para procesar, lo que lleva al error 431.
Causas Comunes de Errores HTTP 431
- Demasiadas cookies: Tener cookies excesivamente grandes o muchas puede causar el error 431. Esto puede ocurrir si se establecen las mismas cookies múltiples veces o si se combinan múltiples cookies en una sola solicitud o respuesta. Un escenario común es reutilizar el mismo puerto
localhost
en varios proyectos y enviar todas las cookies de esos proyectos junto con una solicitud. - Almacenamiento en caché incorrecto de campos de encabezado: Almacenar en caché encabezados grandes de manera incorrecta puede llevar al error 431. El almacenamiento en caché inapropiado puede aumentar el tamaño del encabezado, causando un desbordamiento del búfer.
- Encabezados de solicitud innecesarios o mal formateados: El uso excesivo de encabezados HTTP puede resultar en solicitudes que exceden los límites de tamaño establecidos por el servidor, lo que lleva a una respuesta 431. Además, asegúrate de que tus encabezados estén correctamente formateados. Tener una URL
Referer
demasiado larga puede activar un 431.
Cómo Evitar el Error 431
Limpiar Cookies
Limpiar regularmente las cookies en el lado del cliente (Herramienta de desarrollo de Chrome > Aplicación > Cookies) y restringir la cantidad de cookies utilizadas en el servidor.
Almacenar Encabezados en Caché
Implementar correctamente el almacenamiento en caché de encabezados para asegurarse de que los encabezados en caché reflejen la solicitud real y la respuesta comprimida. Ajusta los ETags si dependes mucho de ellos para solicitudes condicionales, ya que los ETags grandes pueden contribuir al error.
Minimizar los Encabezados HTTP
Simplifica tus encabezados HTTP para incluir solo la información necesaria. Evita incluir metadatos redundantes, especialmente en encabezados como Authorization, Referer y User-Agent.
Comprimir el Tamaño de los Encabezados
A veces, no estás enviando suficientes encabezados y tus encabezados están inflados debido a restricciones fuera de tu control (por ejemplo, tu token JWT codifica una gran cantidad de información). La compresión de encabezados puede reducir significativamente el tamaño de tus encabezados de solicitud. Utiliza protocolos como HTTP/2 y HTTP/3, que admiten la compresión de encabezados de forma predeterminada. Esto puede reducir automáticamente el tamaño de tus encabezados sin requerir configuración adicional.
Manejo de Límites Máximos de Tamaño de Encabezados del Servidor
La especificación HTTP no define un límite en el tamaño de los encabezados; sin embargo, muchos servidores sí lo hacen. Aquí están los límites para varios servidores/web hosts populares:
- Apache: 8K
- nginx: 4K-8K
- IIS: 8K-16K
- Tomcat: 8K-48K
- Node: (<13) – 8K; (>13) – 16K
- Cloudflare: 16K por encabezado, 32K en total
La mayoría de los servidores permiten algún tipo de configuración, y diferentes versiones del software del servidor pueden tener límites más bajos o más altos. También deberías consultar la documentación más reciente para ver si estos límites incluyen otras partes de la solicitud (por ejemplo, cookies) o solo las cabeceras regulares.
Aumentar el Límite de Tamaño de la Cabecera de Solicitud
A veces, puede ser necesario aumentar el límite de tamaño de la cabecera de solicitud. Generalmente, puedes hacerlo desde la consola web o la CLI de tu servidor. Si estás desarrollando localmente, suelen haber flags de CLI que pueden configurar este valor. Aquí está el flag para configurar los límites de tamaño de la cabecera de solicitud en Node JS:
--max-http-header-size=16384
Nota: Aumentar el límite de tamaño de la cabecera debe hacerse con precaución, ya que cabeceras más grandes pueden consumir más memoria y degradar el rendimiento.
Cómo Enviar Respuestas de Error HTTP 431
Tal vez no quieras confiar en tu servidor para determinar el límite de tamaño de la cabecera de solicitud, o quizás quieras imponer un límite de tamaño de cabecera personalizado por endpoint de API. Sigue los pasos a continuación para aprender cómo enviar tus propios errores 431.
Integrar Límites de Tamaño de Cabecera de Solicitud en tu API
Como se mencionó anteriormente, tu combinación de host + servidor probablemente impondrá automáticamente un límite. Para construir tu propia capacidad de límite de tamaño de cabecera de solicitud en tu API, puedes usar bibliotecas como express
en Node.js. Aquí hay un ejemplo que ilustra cómo habilitar límites en los tamaños de las cabeceras de solicitud:
const express = require("express");
const app = express();
app.get("/", (req, res) => {
const headerSizeInBytes = JSON.stringify(req.headers).length;
const maxHeaderSizeInBytes = 2000; // example limit
if (headerSizeInBytes > maxHeaderSizeInBytes) {
res.status(431).send("Request Header Fields Too Large");
} else {
res.send("Hello World!");
}
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
Diferenciación de Respuestas de Error Entre el Tamaño Total de Encabezados de Solicitud y un Solo Campo de Encabezado
Al manejar el error HTTP 431, asegúrate de diferenciar las respuestas entre dos escenarios:
- El tamaño total de los encabezados de solicitud es demasiado grande: Retorna una respuesta que indique que el tamaño acumulado de los encabezados es demasiado grande.
- El tamaño de los campos de encabezado individuales es demasiado grande: En este caso, proporciona una respuesta de error que especifique qué campo de encabezado específico excede el tamaño permitido.
Modifica el ejemplo de la sección anterior para lograr respuestas de error diferenciadas:
const express = require("express");
const app = express();
app.get("/", (req, res) => {
const headerSizeInBytes = JSON.stringify(req.headers).length;
const maxHeaderSizeInBytes = 2000; // example limit
const exceededHeaderField = Object.keys(req.headers).find(
(key) => req.headers[key].length > maxHeaderSizeInBytes * 0.1, // example individual field limit
);
if (exceededHeaderField) {
res
.status(431)
.send(
`Size of Individual Header Field '${exceededHeaderField}' Too Large`,
);
} else if (headerSizeInBytes > maxHeaderSizeInBytes) {
res.status(431).send("Total Size of Request Headers Too Large");
} else else {
res.send("Hello World!");
}
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});
Ejemplo de una Respuesta HTTP 431
Recomendamos responder a tus usuarios utilizando el formato de detalles de problema en la respuesta de la API.
HTTP/1.1 431 Request Header Fields Too Large
Content-Type: application/problem+json
Content-Language: en
{
"type": "https://httpproblems.com/http-status/431",
"title": "Request Header Fields Too Large",
"detail": "Size of individual header field 'referer' too large",
"instance": "/account/12345/msgs/abc",
"trace": {
"requestId": "4d54e4ee-c003-4d75-aba9-e09a6d707b08"
}
}
Dejar que tu Gateway Maneje Límites de Tamaño de Encabezados de Solicitud
Si usas un gateway de API, puedes agregar fácilmente una política a tu pipeline de solicitud para manejar esto. Aquí te mostramos cómo hacerlo usando Zuplo:
Navega a tu ruta en el Diseñador de Rutas y haz clic en Agregar Política en el pipeline de solicitud.
En el modal Elegir Política, tenemos dos opciones dependiendo de lo que quieras hacer.
- Limita el tamaño total de la solicitud con la Política de Límite de Tamaño de Solicitud.
- Use la Política de Entrada de Código Personalizado y copie el ejemplo de código de arriba (sin las partes express) en un módulo de typescript que se conectará a la política.
Conclusión
El error HTTP 431 a menudo es desencadenado por encabezados de solicitud demasiado grandes. Puede evitar encontrarse con este error optimizando sus encabezados, comprimiéndolos según sea necesario e implementando límites de tamaño de encabezados de solicitud en sus API.
Además, implementar verificaciones de límite de tamaño de encabezados en su API es sencillo. La mayoría de los servidores ya incluyen valores predeterminados, y también puede hacerlo usted mismo tanto a nivel acumulativo como individual de los encabezados dentro de las rutas de su API.
Source:
https://dzone.com/articles/understanding-the-http-431-error