קוד המצב HTTP 431, הידוע גם כ"שדות כותרת בקשה גדולים מדי", הוא שגיאה מצד הלקוח שמציינת שהשרת מסרב לעבד בקשה מכיוון ששדות הכותרת שלה גדולים מדי. שגיאה זו יכולה להיגרם עקב גודל כולל של הכותרות או עקב שדה כותרת בודד שחורג מהגודל המותר.
קוד המצב HTTP 431 הוצג לראשונה בRFC 6585, שפורסם באפריל 2012. זה היה חלק ממאמץ לתקנן תגובות נוספות ל HTTP/1.1, שהתייחסו לבעיות שלא כוסו על ידי קודי המצב הקיימים בזמנו. הצגת קוד השגיאה המסוים הזה הייתה קריטית לשיפור אבטחת השרת ולמניעת התקפות זדוניות כמו התקפות עומס יתר, שיכולות לנצלכותרות גדולות.
הבנת שגיאת HTTP 431
כאשר מתרחשת שגיאה 431, זה אומר שהשרת חסם את בקשת הלקוח עקב שדות כותרת גדולים מדי. לכל שרת יש מדיניות משלו לגבי הגודל המרבי המותר לשדות כותרת HTTP, מה שעוזר להגן מפני התקפות מניעת שירות.
תסמינים נפוצים של שגיאות HTTP 431
- גודל כולל של כותרות בקשה גדול מדי: שגיאה זו מתרחשת כאשר הגודל המצטבר של כל כותרות הבקשה חורג מהמגבלה.
- גודל של שדה כותרת בודד גדול מדי: במקרה זה, שדה כותרת בודד הוא גדול מדי לעיבוד, מה שמוביל לשגיאה 431.
סיבות נפוצות לשגיאות HTTP 431
- יותר מידי קוקיז: קיום קוקיז גדולים או רבים מדי יכול לגרום לשגיאה 431. זה יכול לקרות אם אותם קוקיז מוגדרים פעמים רבות או אם מספר קוקיז משולבים בבקשה אחת או בתגובה אחת. תרחיש נפוץ הוא שימוש חוזר באותו פורט
localhost
עבור מספר פרויקטים ושליחת כל קוקיז של אותם פרויקטים יחד עם בקשה. - אחסון שדות כותרת בצורה לא נכונה: אחסון כותרות גדולות בצורה לא נכונה יכול להוביל לשגיאה 431. אחסון לא נכון יכול להגדיל את גודל הכותרת, מה שגורם לעומס יתר על המאגר.
- שדות בקשה לא נחוצים או מעוצבים בצורה לא נכונה: שימוש יתר בכותרות HTTP יכול להוביל לבקשות שחורגות מהמגבלות על גודל שהוגדרו על ידי השרת, מה שמוביל לתגובה 431. בנוסף, ודא שהכותרות שלך מעוצבות כראוי. כותרת
Referer
שהיא ארוכה מדי יכולה להפעיל שגיאה 431.
איך להימנע משגיאה 431
נקה קוקיז
נקה קוקיז בצד הלקוח באופן קבוע (כלי מפתח כרום > אפליקציה > קוקיז) והגבל את מספר הקוקיז שבהם משתמשים בשרת.
אחסון כותרות
הטמעת מטמון כותרות בצורה נכונה כדי להבטיח שהכותרות המטמונות משקפות את הבקשה האמיתית ותגובת הדחיסה. התאם את ETags אם אתה תלוי בהם במידה רבה לבקשות מותנות, כי ETags גדולים יכולים לתרום לשגיאה.
מזעור כותרות HTTP
פשט את כותרות ה-HTTP שלך כך שיכללו רק מידע הכרחי. הימנע מהכללת מטא-דטה מיותר, במיוחד בכותרות כמו Authorization, Referer ו-User-Agent.
דחיסת גודל הכותרת
לפעמים, אתה לא שולח מספיק כותרות והכותרות שלך מנופחות בגלל מגבלות שאינן תלויות בך (למשל, טוקן ה-JWT שלך מקודד כמות גדולה של מידע). דחיסת כותרות יכולה להפחית במידה ניכרת את גודל כותרות הבקשה שלך. השתמש בפרוטוקולים כמו HTTP/2 ו-HTTP/3, שתומכים בדחיסת כותרות כברירת מחדל. זה יכול להפחית אוטומטית את גודל הכותרות שלך ללא צורך בתצורה נוספת.
התמודדות עם מגבלות גודל כותרת מקסימלי של שרת
המפרט של HTTP לא מגדיר מגבלה על גודל הכותרת; עם זאת, הרבה שרתים כן. הנה המגבלות עבור שרתי/מארחי אינטרנט פופולריים שונים:
- Apache: 8K
- nginx: 4K-8K
- IIS: 8K-16K
- Tomcat: 8K-48K
- Node: (<13) – 8K; (>13) – 16K
- Cloudflare: 16K לכותרת, 32K סך הכל
רוב השרתים מאפשרים צורה מסוימת של תצורה, וגרסאות שונות של תוכנת השרת עשויות להיות עם מגבלות נמוכות או גבוהות יותר. כמו כן, עליך לבדוק את התיעוד העדכני ביותר כדי לראות אם המגבלות הללו כוללות חלקים אחרים של הבקשה (למשל, קוקיז) או רק את הכותרות הרגילות.
הגדלת מגבלת גודל כותרת הבקשה
לפעמים, ייתכן שיהיה צורך בהגדלת מגבלת גודל כותרת הבקשה. בדרך כלל ניתן לעשות זאת מהקונסולה הוובית או ה-CLI של השרת שלך. אם אתה מפתח באופן מקומי, יש בדרך כלל דגלי CLI שיכולים לתצרף את הערך הזה. הנה הדגל לתצרף מגבלות גודל כותרת בקשה ב-Node JS:
--max-http-header-size=16384
שים לב: הגדלת מגבלת גודל הכותרת צריכה להיעשות בזהירות, כי כותרות גדולות יותר יכולות לצרוך יותר זיכרון ולהוריד את הביצועים.
איך לשלוח תגובות שגיאה HTTP 431
ייתכן שלא תרצה לסמוך על השרת שלך לקביעת מגבלת גודל כותרת הבקשה שלך, או שאולי אתה רוצה לאכוף מגבלת גודל כותרת מותאמת אישית לכל נקודת קצה של API. עקוב אחרי השלבים הבאים כדי ללמוד איך לשלוח שגיאות 431 משלך.
שילוב מגבלות גודל כותרת בקשה ב-API שלך
כמו שצוין למעלה, סיבוב המארח + השרת שלך כנראה יאכוף אוטומטית מגבלה. כדי לבנות יכולת מגבלת גודל כותרת בקשה מותאמת אישית ב-API שלך, ניתן להשתמש בספריות כמו express
ב-Node.js. הנה דוגמה הממחישה איך לאפשר מגבלות על גודל כותרות בקשה:
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");
});
הבחנה בין תגובות שגיאה לגבי גודל כולל של כותרות בקשה ושדה כותרת בודד
כשמטפלים בשגיאת HTTP 431, יש להבחין בין שני מצבים:
- גודל כולל של כותרות בקשה גדול מדי: החזר תגובה המציינת כי הגודל המצטבר של הכותרות גדול מדי.
- גודל של שדה כותרת בודד גדול מדי: במקרה זה, ספק תגובת שגיאה המציינת איזה שדה כותרת מסוים חורג מהגודל המותר.
שנה את הדוגמה מהקטע הקודם כדי להשיג תגובות שגיאה מובחנות:
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");
});
דוגמה לתגובת HTTP 431
אנו ממליצים להשיב למשתמשים שלך באמצעות פורמט תגובת 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"
}
}
לתת לשער הכניסה שלך להתמודד עם מגבלות גודל של כותרות בקשה
אם אתה משתמש בשער API, אתה יכול בקלות להוסיף מדיניות למסלול הבקשה שלך כדי להתמודד עם זה. הנה איך לעשות זאת באמצעות Zuplo:
עבור לנתיב שלך ב מעצב נתיבים ולחץ על הוסף מדיניות במסלול הבקשה.
בחלון בחר מדיניות, יש לנו שתי אפשרויות בהתאם למה שאתה רוצה לעשות.
- הגבל את גודל הבקשה כולה עם מדיניות מגבלת גודל בקשה.
- השתמש ב- מדיניות קוד מותאם אישית נכנסת והעתק את דוגמת הקוד מלמעלה (ללא החלקים המהירים) לתוך מודול טייפסקריפט שיוחבר למדיניות.
מסקנה
שגיאת HTTP 431 נפוצה כתוצאה מראשי דף בגודל גדול מדי. ניתן להימנע מהשגיאה הזו על ידי עיצוב מחדש של ראשי הדף שלך, דחיסתם ככל שנדרש, ויישום מגבלות גודל על ראשי דף ב-API שלך.
בנוסף, יישום בדיקות מגבלת גודל של ראשי דף ב-API שלך הוא פשוט. רוב השרתים כבר כוללים ברירות מחדל, ואתה יכול גם לעשות את זה בעצמך ברמות הסכום והבודדות של נתיבי ה-API שלך.
Source:
https://dzone.com/articles/understanding-the-http-431-error