O código de status HTTP 431, também conhecido como “Campos de Cabeçalho da Requisição Muito Grandes”, é um erro do lado do cliente que indica que o servidor recusa-se a processar uma requisição porque seus campos de cabeçalho são muito grandes. Este erro pode ser causado tanto pelo tamanho total dos cabeçalhos quanto por um único campo de cabeçalho excedendo o tamanho permitido.
O código de status HTTP 431 foi introduzido pela primeira vez na RFC 6585, publicada em abril de 2012. Isso fez parte de um esforço para padronizar respostas adicionais para HTTP/1.1, abordando problemas que não eram cobertos pelos códigos de status existentes na época. A introdução deste código de erro específico foi crucial para aprimorar a segurança do servidor e prevenir ataques maliciosos, como ataques de estouro de buffer, que poderiam explorar cabeçalhos grandes.
Compreendendo o Erro HTTP 431
Quando ocorre um erro 431, isso significa que o servidor bloqueou a requisição do cliente devido a campos de cabeçalho excessivamente grandes. Cada servidor tem suas próprias políticas regarding the maximum allowed size for HTTP header fields, which helps protect against denial-of-service attacks.
Sintomas Comuns de Erros HTTP 431
- O tamanho total dos cabeçalhos da requisição é muito grande: Este erro ocorre quando o tamanho cumulativo de todos os cabeçalhos da requisição excede o limite.
- O tamanho de campos de cabeçalho individuais é muito grande: Neste caso, um único campo de cabeçalho é muito grande para ser processado, levando ao erro 431.
Causas Comuns de Erros HTTP 431
- Muitos cookies: Ter cookies excessivamente grandes ou muitos pode causar o erro 431. Isso pode acontecer se os mesmos cookies forem definidos várias vezes ou se vários cookies forem combinados em uma única solicitação ou resposta. Um cenário comum é reutilizar a mesma porta
localhost
em vários projetos e enviar todos os cookies desses projetos junto com uma solicitação. - Caching incorreto de campos de cabeçalho: Armazenar em cache cabeçalhos grandes de maneira incorreta pode levar ao erro 431. O caching inadequado pode aumentar o tamanho do cabeçalho, causando um overflow de buffer.
- Cabeçalhos de solicitação desnecessários ou mal formatados: O uso excessivo de cabeçalhos HTTP pode resultar em solicitações que excedem os limites de tamanho definidos pelo servidor, levando a uma resposta 431. Além disso, certifique-se de que seus cabeçalhos estão bem formatados. Ter uma URL
Referer
muito longa pode acionar um 431.
Como Evitar o Erro 431
Limpar Cookies
Limpe regularmente os cookies no lado do cliente (Ferramenta de desenvolvedor do Chrome > Aplicativo > Cookies) e restrinja o número de cookies usados no servidor.
Cache de Cabeçalhos
Implemente o cache de cabeçalhos corretamente para garantir que os cabeçalhos em cache refletam a solicitação real e a resposta de compressão. Ajuste os ETags se você depender fortemente deles para solicitações condicionais, pois ETags grandes podem contribuir para o erro.
Minimize os Cabeçalhos HTTP
Simplifique seus cabeçalhos HTTP para incluir apenas informações necessárias. Evite incluir metadados redundantes, especialmente em cabeçalhos como Authorization, Referer e User-Agent.
Comprimindo o Tamanho do Cabeçalho
Às vezes, você não está enviando cabeçalhos suficientes e seus cabeçalhos estão inchados devido a restrições fora do seu controle (por exemplo, seu token JWT codifica uma tonelada de informações). A compressão de cabeçalhos pode reduzir significativamente o tamanho dos cabeçalhos de suas solicitações. Utilize protocolos como HTTP/2 e HTTP/3, que suportam compressão de cabeçalhos por padrão. Isso pode automaticamente reduzir o tamanho de seus cabeçalhos sem exigir configuração adicional.
Lidando com Limites Máximos de Tamanho de Cabeçalho do Servidor
A especificação HTTP não define um limite para o tamanho do cabeçalho; no entanto, muitos servidores o fazem. Aqui estão os limites para vários servidores/web hosts populares:
- Apache: 8K
- nginx: 4K-8K
- IIS: 8K-16K
- Tomcat: 8K-48K
- Node: (<13) – 8K; (>13) – 16K
- Cloudflare: 16K por cabeçalho, 32K no total
A maioria dos servidores permite algum tipo de configuração, e diferentes versões do software do servidor podem ter limites mais baixos ou mais altos. Você também deve verificar a documentação mais recente para ver se esses limites incluem outras partes da solicitação (por exemplo, cookies) ou apenas os cabeçalhos regulares.
Aumentando o Limite de Tamanho do Cabeçalho da Solicitação
Às vezes, pode ser necessário aumentar o limite de tamanho do cabeçalho da solicitação. Geralmente, você pode fazer isso a partir do console web ou CLI do seu servidor. Se você estiver desenvolvendo localmente, há normalmente flags de CLI que podem configurar esse valor. Aqui está a flag para configurar os limites de tamanho do cabeçalho da solicitação no Node JS:
--max-http-header-size=16384
Nota: Aumentar o limite de tamanho do cabeçalho deve ser feito com cautela, pois cabeçalhos maiores podem consumir mais memória e degradar o desempenho.
Como Enviar Respostas de Erro HTTP 431
Você pode não querer confiar no seu servidor para determinar o limite de tamanho do cabeçalho da sua solicitação, ou talvez queira impor um limite de tamanho de cabeçalho personalizado por endpoint da API. Siga os passos abaixo para aprender como enviar seus próprios erros 431.
Integrando Limites de Tamanho do Cabeçalho da Solicitação na Sua API
Como mencionado acima, a combinação de host + servidor provavelmente aplicará automaticamente um limite. Para construir sua própria capacidade de limite de tamanho do cabeçalho da solicitação na sua API, você pode usar bibliotecas como express
no Node.js. Aqui está um exemplo ilustrando como habilitar limites nos tamanhos dos cabeçalhos da solicitação:
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");
});
Diferenciando Respostas de Erro Entre o Tamanho Total dos Cabeçalhos da Requisição e um Campo de Cabeçalho Único
Ao lidar com o erro HTTP 431, certifique-se de diferenciar as respostas entre dois cenários:
- O tamanho total dos cabeçalhos da requisição é muito grande: Retorne uma resposta indicando que o tamanho cumulativo dos cabeçalhos é muito grande.
- O tamanho dos campos de cabeçalho individuais é muito grande: Neste caso, forneça uma resposta de erro que indique qual campo de cabeçalho específico excede o tamanho permitido.
Modifique o exemplo da seção anterior para alcançar respostas de erro 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");
});
Exemplo de uma Resposta HTTP 431
Recomendamos responder aos seus usuários usando o formato de detalhes de problema na resposta da 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"
}
}
Deixando Seu Gateway Lidar com Limites de Tamanho de Cabeçalho da Requisição
Se você usar um gateway de API, pode facilmente adicionar uma política ao seu pipeline de requisição para lidar com isso. Aqui está como fazer isso usando Zuplo:
Navegue até sua rota no Designer de Rotas e clique em Adicionar Política no pipeline de requisição.
No modal Escolher Política, temos duas opções, dependendo do que você deseja fazer.
- Limite todo o tamanho da requisição com a Política de Limite de Tamanho da Requisição.
- Use a Política de Entrada de Código Personalizado e copie o exemplo de código acima (sem as partes express) para um módulo typescript que será conectado à política.
Conclusão
O erro HTTP 431 geralmente é acionado por cabeçalhos de solicitação excessivamente grandes. Você pode evitar encontrar esse erro otimizando seus cabeçalhos, compactando-os conforme necessário e implementando limites de tamanho de cabeçalho de solicitação em suas APIs.
Além disso, implementar verificações de limite de tamanho de cabeçalho em sua API é simples. A maioria dos servidores já inclui padrões e você também pode fazer isso sozinho tanto no nível cumulativo quanto no nível de cabeçalho individual dentro das rotas da sua API.
Source:
https://dzone.com/articles/understanding-the-http-431-error