Comprendere l’Errore HTTP 431: Una Guida per Sviluppatori

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:

Shell

 

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:

JavaScript

 

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:

  1. La dimensione totale degli intestazioni della richiesta è troppo grande: Restituire una risposta che indichi che la dimensione cumulativa degli intestazioni è troppo grande.
  2. 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:

JavaScript

 

Esempio di Risposta HTTP 431

Consigliamo di rispondere ai vostri utenti utilizzando il formato di risposta API dei Dettagli del Problema.

JSON

 

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.

  1. Limitare l’intera dimensione della richiesta con la Policy di Limite di Dimensione della Richiesta.
  2. 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