O código de status HTTP 431, também conhecido como “Request Header Fields Too Large”, é um erro do lado do cliente que indica que o servidor se recusa a processar uma solicitaçã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 que excede o tamanho permitido.
O código de status HTTP 431 foi introduzido pela primeira vez no RFC 6585, publicado em abril de 2012. Isso fez parte de um esforço para padronizar respostas adicionais para HTTP/1.1, abordando questões que não eram cobertas 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, significa que o servidor bloqueou a solicitação do cliente devido a campos de cabeçalho excessivamente grandes. Cada servidor possui suas próprias políticas em relação ao tamanho máximo permitido para os campos de cabeçalho HTTP, o que ajuda a proteger contra ataques de negação de serviço.
Sintomas Comuns de Erros HTTP 431
- O tamanho total dos cabeçalhos da solicitação é muito grande: Este erro ocorre quando o tamanho cumulativo de todos os cabeçalhos da solicitação excede o limite.
- O tamanho dos campos de cabeçalho individuais é muito grande: Neste caso, um único campo de cabeçalho é muito grande para processar, levando ao erro 431.
Causas Comuns de Erros HTTP 431
- Cookies em excesso: Ter cookies excessivamente grandes ou em grande quantidade pode causar o erro 431. Isso pode ocorrer 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. - Cache inadequado de campos de cabeçalho: Fazer cache de cabeçalhos grandes de forma inadequada pode levar ao erro 431. O cache inadequado pode aumentar o tamanho do cabeçalho, causando um estouro 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 estejam devidamente formatados. Ter uma URL
Referer
que seja longa demais 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çalho corretamente para garantir que os cabeçalhos em cache reflitam a solicitação real e a resposta de compressão. Ajuste os ETags se você depender muito 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 Autorização, 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 muitas informações). A compressão de cabeçalhos pode reduzir significativamente o tamanho dos cabeçalhos da sua solicitação. Utilize protocolos como HTTP/2 e HTTP/3, que suportam compressão de cabeçalhos por padrão. Isso pode reduzir automaticamente 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 de tamanho de cabeçalho; no entanto, muitos servidores o fazem. Aqui estão os limites para vários servidores/hosts da web 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, aumentar o limite de tamanho do cabeçalho da solicitação pode ser necessário. Normalmente, você pode fazer isso a partir do console da web ou da CLI do seu servidor. Se você estiver desenvolvendo localmente, geralmente existem flags de CLI que podem configurar esse valor. Aqui está a flag para configurar 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 depender do seu servidor para determinar o limite de tamanho do cabeçalho da sua solicitação, ou talvez você 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.
Incorporando Limites de Tamanho do Cabeçalho da Solicitação em 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 em 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 de Solicitação e um Único Campo de Cabeçalho
Ao lidar com o erro HTTP 431, certifique-se de diferenciar as respostas entre dois cenários:
- O tamanho total dos cabeçalhos de solicitaçã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 obter 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 Resposta de Detalhes do Problema 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 de Solicitação
Se você usar um gateway de API, pode facilmente adicionar uma política ao seu pipeline de solicitação para lidar com isso. Veja como fazer isso usando o Zuplo:
Navegue até sua rota no Designer de Rotas e clique em Adicionar Política no pipeline de solicitação.
No modal Escolher Política, temos duas opções dependendo do que você deseja fazer.
- Limite o tamanho total da solicitação com a Política de Limite de Tamanho de Solicitação.
- Use o Política de Código Personalizado de Entrada e copie o exemplo de código acima (menos as partes expressas) em um módulo TypeScript que será conectado à política.
Conclusão
O erro HTTP 431 é frequentemente acionado por cabeçalhos de solicitação excessivamente grandes. Você pode evitar encontrar esse erro otimizando seus cabeçalhos, comprimindo-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 fazê-lo sozinho nos níveis de cabeçalho cumulativo e individual a partir de suas rotas de API.
Source:
https://dzone.com/articles/understanding-the-http-431-error