De HTTP-statuscode 431, ook wel bekend als “Request Header Fields Too Large,” is een client-side fout die aangeeft dat de server weigert een verzoek te verwerken omdat de headervelden te groot zijn. Deze fout kan worden veroorzaakt door ofwel de totale grootte van de headers of een enkel headerveld dat de toegestane grootte overschrijdt.
De HTTP 431-statuscode werd voor het eerst geïntroduceerd in RFC 6585, gepubliceerd in april 2012. Dit maakte deel uit van een inspanning om aanvullende antwoorden voor HTTP/1.1 te standaardiseren, en om problemen aan te pakken die niet werden behandeld door de bestaande statuscodes op dat moment. Het introduceren van deze specifieke foutcode was cruciaal voor het verbeteren van de serverbeveiliging en het voorkomen van kwaadaardige aanvallen zoals buffer overflow-aanvallen, die zouden kunnen profiteren van grote headers.
Begrijpen van de HTTP 431-fout
Wanneer een 431-fout optreedt, betekent dit dat de server het verzoek van de cliënt heeft geblokkeerd vanwege buitensporig grote headervelden. Elke server heeft zijn eigen beleidsregels met betrekking tot de maximaal toegestane grootte voor HTTP-headervelden, wat helpt beschermen tegen denial-of-service-aanvallen.
Veelvoorkomende symptomen van HTTP 431-fouten
- De totale grootte van de verzoekheaders is te groot: Deze fout doet zich voor wanneer de cumulatieve grootte van alle verzoekheaders de limiet overschrijdt.
- De grootte van individuele headervelden is te groot: In dit geval is een enkel headerveld te groot om te verwerken, wat leidt tot de 431-fout.
Gemeenschappelijke oorzaken van HTTP 431 Fouten
- Te veel cookies: Het hebben van overdreven grote of veel cookies kan de 431 fout veroorzaken. Dit kan gebeuren als dezelfde cookies meerdere keren worden ingesteld of als meerdere cookies worden gecombineerd in één verzoek of reactie. Een veelvoorkomend scenario is het hergebruiken van dezelfde
localhost
poort over meerdere projecten en het verzenden van al die projectcookies samen met een verzoek. - Onjuiste header caching: Onjuist cachen van grote headers kan leiden tot de 431 fout. Onjuist cachen kan de headersize vergroten, wat kan leiden tot een bufferoverflow.
- Niet-noodzakelijke of slecht opgemaakte verzoekheaders: Overmatig gebruik van HTTP-headers kan leiden tot verzoeken die de door de server ingestelde groottelimieten overschrijden, wat resulteert in een 431 reactie. Zorg er ook voor dat uw headers correct zijn opgemaakt. Een te lange
Referer
URL kan een 431 activeren.
Hoe de 431 Fout te Vermijden
Verwijder Cookies
Verwijder regelmatig cookies aan de clientzijde (Chrome-ontwikkelaarshulpprogramma > Toepassing > Cookies) en beperk het aantal cookies dat op de server wordt gebruikt.
Cache Headers
Implementeer header caching correct om ervoor te zorgen dat de gecachte headers de werkelijke aanvraag en compressierespons weerspiegelen. Pas ETags aan als je sterk afhankelijk bent van hen voor voorwaardelijke aanvragen, aangezien grote ETags kunnen bijdragen aan de fout.
Minimaliseer HTTP Headers
Simplificeer je HTTP-headers zodat ze alleen noodzakelijke informatie bevatten. Vermijd het opnemen van overbodige metadata, vooral in headers zoals Authorization, Referer en User-Agent.
Header Grootte Comprimeren
Soms stuur je niet genoeg headers en zijn je headers opgeblazen door beperkingen buiten jouw controle (bijv., je JWT-token encodeert een hoop informatie). Headercompressie kan de grootte van je aanvraagheaders aanzienlijk verminderen. Maak gebruik van protocollen zoals HTTP/2 en HTTP/3, die standaard headercompressie ondersteunen. Dit kan automatisch de grootte van je headers verminderen zonder extra configuratie.
Omgaan Met Server Max Header Grootte Limieten
De HTTP-specificatie definieert geen limiet voor de header grootte; veel servers doen dat echter wel. Hier zijn de limieten voor verschillende populaire webservers/hosts:
- Apache: 8K
- nginx: 4K-8K
- IIS: 8K-16K
- Tomcat: 8K-48K
- Node: (<13) – 8K; (>13) – 16K
- Cloudflare: 16K per header, 32K totaal
De meeste servers staan enige vorm van configuratie toe, en verschillende versies van de server software kunnen lagere of hogere limieten hebben. Je moet ook de laatste documentatie controleren om te zien of deze limieten andere delen van het verzoek omvatten (bijv. cookies) of alleen de reguliere headers.
Het verhogen van de limiet voor de verzoekheadergrootte
Soms is het nodig om de limiet voor de verzoekheadergrootte te verhogen. Dit kun je meestal doen vanuit de webconsole of CLI voor je server. Als je lokaal aan het ontwikkelen bent, zijn er meestal CLI-vlaggen die deze waarde kunnen configureren. Hier is de vlag om de limieten voor verzoekheadergrootte in te stellen in Node JS:
--max-http-header-size=16384
Opmerking: Het vergroten van de limiet voor de headergrootte moet met voorzichtigheid gebeuren, aangezien grotere headers meer geheugen kunnen verbruiken en de prestaties kunnen verminderen.
Hoe HTTP 431 Foutreacties te verzenden
Je wilt wellicht niet vertrouwen op je server om je limiet voor de verzoekheadergrootte te bepalen, of misschien wil je een aangepaste limiet voor de headergrootte afdwingen per API-eindpunt. Volg de onderstaande stappen om te leren hoe je je eigen 431 fouten kunt verzenden.
Limieten voor verzoekheadergrootte inbouwen in je API
Zoals hierboven vermeld, zal je host + serversoftware combinatie waarschijnlijk automatisch een limiet afdwingen. Om je eigen aangepaste limiet voor verzoekheadergrootte mogelijkheid in je API in te bouwen, kun je bibliotheken zoals express
in Node.js gebruiken. Hier is een voorbeeld dat illustreert hoe je limieten voor verzoekheadergroottes kunt inschakelen:
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");
});
Het differentiëren van foutreacties tussen de totale grootte van de verzoekheaders en een enkel kopveld
Bij het afhandelen van de HTTP 431-fout, zorg ervoor dat je reacties differentieert tussen twee scenario’s:
- De totale grootte van de verzoekheaders is te groot: Geef een reactie die aangeeft dat de cumulatieve grootte van de headers te groot is.
- De grootte van de individuele kopvelden is te groot: Geef in dit geval een foutreactie waarin staat welk specifiek kopveld de toegestane grootte overschrijdt.
Wijzig het voorbeeld uit de vorige sectie om gedifferentieerde foutreacties te bereiken:
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");
});
Voorbeeld van een HTTP 431-reactie
We raden aan om te reageren op je gebruikers met behulp van het Probleemdetails API-responsformaat.
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"
}
}
Laat je gateway de limieten voor de grootte van de verzoekheaders afhandelen
Als je een API-gateway gebruikt, kun je eenvoudig een beleid toevoegen aan je verzoekpijplijn om hiermee om te gaan. Zo doe je dat met behulp van Zuplo:
Navigeer naar je route in de Route Designer en klik op Beleid toevoegen in de verzoekpijplijn.
In het Kies beleid-venster hebben we twee opties, afhankelijk van wat je wilt doen.
- Beperk de gehele verzoekgrootte met het Beleid voor limiet van verzoekgrootte.
- Gebruik het Aangepaste Code Inkomend Beleid en kopieer het codevoorbeeld hierboven (zonder de express-stukken) naar een TypeScript-module die verbonden zal zijn met het beleid.
Conclusie
De HTTP 431-fout wordt vaak veroorzaakt door te grote verzoekheaders. U kunt deze fout vermijden door uw headers te optimaliseren, ze indien nodig te comprimeren en verzoekheadergroottebeperkingen te implementeren in uw API’s.
Bovendien is het eenvoudig om headergroottecontroles in uw API te implementeren. De meeste servers hebben al standaardinstellingen, en u kunt ook zelf controles uitvoeren op zowel cumulatieve als individuele headerniveaus vanuit uw API-routes.
Source:
https://dzone.com/articles/understanding-the-http-431-error