Il codice di stato HTTP 431, noto anche come “Request Header Fields Too Large”, è un errore lato client che indica che il server rifiuta di elaborare una richiesta perché i suoi campi di intestazione sono troppo grandi. Questo errore può essere causato sia dalla dimensione totale delle intestazioni che da un singolo campo di intestazione che supera la dimensione consentita.
Il codice di stato HTTP 431 è stato introdotto per la prima volta in RFC 6585, pubblicato nel aprile 2012. Questo faceva parte di uno sforzo per standardizzare risposte aggiuntive per HTTP/1.1, affrontando problemi che non erano coperti dai codici di stato esistenti all’epoca. L’introduzione di questo codice di errore specifico è stata cruciale per migliorare la sicurezza del server e prevenire attacchi malicious come gli attacchi di buffer overflow, che potrebbero sfruttare intestazioni grandi.
Comprendere l’Errore HTTP 431
Quando si verifica un errore 431, significa che il server ha bloccato la richiesta del client a causa di campi di intestazione eccessivamente grandi. Ogni server ha le proprie politiche riguardo la dimensione massima consentita per i campi di intestazione HTTP, il che aiuta a proteggere contro attacchi di tipo denial-of-service.
Sintomi Comuni degli Errori HTTP 431
- La dimensione totale delle intestazioni della richiesta è troppo grande: Questo errore si verifica quando la dimensione cumulativa di tutte le intestazioni della richiesta supera il limite.
- La dimensione dei singoli campi di intestazione è troppo grande: In questo caso, un singolo campo di intestazione è troppo grande da elaborare, portando all’errore 431.
Cause Comuni degli Errori HTTP 431
- Troppi cookie: Avere cookie eccessivamente grandi o numerosi può causare l’errore 431. Questo può accadere se gli stessi cookie vengono impostati più volte o se molteplici cookie vengono combinati in una singola richiesta o risposta. Uno scenario comune è riutilizzare la stessa porta
localhost
attraverso più progetti e inviare tutti i cookie di quei progetti insieme a una richiesta. - Cache non corretta dei campi dell’intestazione: Caching errato di intestazioni grandi può portare all’errore 431. Una cache non corretta può aumentare la dimensione dell’intestazione, causando un overflow del buffer.
- Intestazioni di richiesta non necessarie o mal formattate: Un uso eccessivo delle intestazioni HTTP può risultare in richieste che superano i limiti di dimensione impostati dal server, portando a una risposta 431. Inoltre, assicurati che le tue intestazioni siano correttamente formattate. Avere un URL
Referer
troppo lungo può scatenare un 431.
Come Evitare l’Errore 431
Pulisci i Cookie
Pulisci regolarmente i cookie sul lato client (Strumenti di sviluppo di Chrome > Applicazione > Cookie) e limita il numero di cookie utilizzati sul server.
Cache delle Intestazioni
Implementare correttamente la memorizzazione nella cache degli header per garantire che gli header memorizzati rispecchino la richiesta effettiva e la risposta compressa. Regola gli ETags se fai un uso intensivo di essi per le richieste condizionali, poiché ETags di grandi dimensioni possono contribuire all’errore.
Minimizzare gli header HTTP
Semplifica i tuoi header HTTP includendo solo le informazioni necessarie. Evita di includere metadati ridondanti, specialmente negli header come Authorization, Referer e User-Agent.
Compressione della dimensione degli header
A volte, non stai inviando abbastanza header e i tuoi header sono gonfiati a causa di vincoli fuori dal tuo controllo (ad esempio, il tuo token JWT codifica molte informazioni). La compressione degli header può ridurre significativamente la dimensione dei tuoi header di richiesta. Utilizza protocolli come HTTP/2 e HTTP/3, che supportano la compressione degli header per impostazione predefinita. Questo può ridurre automaticamente la dimensione dei tuoi header senza richiedere configurazioni aggiuntive.
Gestione dei limiti di dimensione massima degli header del server
La specifica HTTP non definisce un limite sulla dimensione degli header; tuttavia, molti server lo fanno. Ecco i limiti per vari server/host web popolari:
- Apache: 8K
- nginx: 4K-8K
- IIS: 8K-16K
- Tomcat: 8K-48K
- Node: (<13) – 8K; (>13) – 16K
- Cloudflare: 16K per header, 32K totali
La maggior parte dei server consente qualche forma di configurazione, e diverse versioni del software del server potrebbero avere limiti più bassi o più alti. Dovresti anche consultare la documentazione più recente per vedere se questi limiti includono altre parti della richiesta (ad esempio, i cookie) o solo gli header regolari.
Aumentare il Limite di Dimensione degli Header della Richiesta
A volte, potrebbe essere necessario aumentare il limite di dimensione degli header della richiesta. Puoi solitamente farlo dalla console web o dalla CLI del tuo server. Se stai sviluppando localmente, ci sono solitamente flag CLI che possono configurare questo valore. Ecco il flag per configurare i limiti di dimensione degli header della richiesta in Node JS:
--max-http-header-size=16384
Nota: L’aumento del limite di dimensione degli header dovrebbe essere fatto con cautela, poiché header più grandi possono consumare più memoria e degradare le prestazioni.
Come Inviare Risposte di Errore HTTP 431
Forse non vuoi fare affidamento sul tuo server per determinare il limite di dimensione degli header della tua richiesta, o magari vuoi imporre un limite di dimensione degli header personalizzato per ogni endpoint API. Segui i passaggi seguenti per imparare come inviare i tuoi errori 431.
Integrare i Limiti di Dimensione degli Header della Richiesta nella Tua API
Come menzionato sopra, la combinazione host + server probabilmente applicherà automaticamente un limite. Per costruire una capacità di limite di dimensione degli header della richiesta personalizzata nella tua API, puoi utilizzare librerie come express
in Node.js. Ecco un esempio che illustra come abilitare i limiti sulle dimensioni degli header della richiesta:
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");
});
Differenziare le Risposte di Errore Tra la Dimensione Totale degli Intestazioni della Richiesta e un Singolo Campo dell’Intestazione
Quando si gestisce l’errore HTTP 431, assicurarsi di differenziare le risposte tra due scenari:
- La dimensione totale degli intestazioni della richiesta è troppo grande: Restituire una risposta che indichi che la dimensione cumulativa degli intestazioni è troppo grande.
- La dimensione dei singoli campi dell’intestazione è troppo grande: In questo caso, fornire una risposta di errore che specifichi quale campo dell’intestazione supera la dimensione consentita.
Modificare l’esempio della sezione precedente per ottenere risposte di errore differenziate:
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");
});
Esempio di Risposta HTTP 431
Consigliamo di rispondere ai vostri utenti utilizzando il formato di risposta API dei Dettagli del Problema.
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"
}
}
Lasciare che il Vostro Gateway Gestisca i Limiti di Dimensione degli Intestazioni della Richiesta
Se utilizzate un gateway API, potete facilmente aggiungere una policy alla vostra pipeline di richiesta per gestire questo. Ecco come farlo utilizzando Zuplo:
Navigate alla vostra rotta nel Progettista di Rotte e cliccate su Aggiungi Policy nella pipeline della richiesta.
Nella modale Scegli Policy, abbiamo due opzioni a seconda di ciò che volete fare.
- Limitare l’intera dimensione della richiesta con la Policy di Limite di Dimensione della Richiesta.
- Usa la Politica di Ingresso del Codice Personalizzato e copia l’esempio di codice sopra riportato (escludendo le parti espresse) in un modulo typescript che sarà collegato alla politica.
Conclusione
L’errore HTTP 431 viene spesso attivato da intestazioni di richiesta troppo grandi. Puoi evitare di incorrere in questo errore ottimizzando le tue intestazioni, comprimendole se necessario, e implementando limiti alla dimensione delle intestazioni di richiesta nelle tue API.
Inoltre, implementare controlli sui limiti di dimensione delle intestazioni nella tua API è semplice. La maggior parte dei server include già impostazioni predefinite, e puoi farlo anche tu sia a livello cumulativo che per ogni intestazione individuale all’interno delle tue rotte API.
Source:
https://dzone.com/articles/understanding-the-http-431-error