رمز الحالة 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
مسح الكعكات
قم بتنظيف الكعكات بانتظام على جانب العميل (أداة Chrome للتطوير > التطبيق > الكعكات) وتقييد عدد الكعكات المستخدمة على الخادم.
تخزين الرؤوس
قم بتطبيق التخزين المؤقت للرأس بشكل صحيح لضمان أن الرؤوس المخزنة تعكس الطلب الفعلي ورد الفعل المضغوط. قم بتعديل 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 إجمالي
معظم الخوادم تسمح ببعض أشكال التكوين، وقد تكون الإصدارات المختلفة من برنامج الخادم لديها حدود أدنى أو أعلى. يجب عليك أيضًا التحقق من أحدث الوثائق لمعرفة ما إذا كانت هذه الحدود تشمل أجزاء أخرى من الطلب (مثل ملفات تعريف الارتباط) أم أنها تشمل فقط الرؤوس العادية.
زيادة حد حجم رأس الطلب
في بعض الأحيان، قد يكون من الضروري زيادة حد حجم رأس الطلب. عادةً ما يمكنك القيام بذلك من وحدة التحكم الويب أو واجهة سطر الأوامر لخادمك. إذا كنت تقوم بالتطوير محليًا، فهناك عادةً أوسمة واجهة سطر الأوامر التي يمكنها تكوين هذه القيمة. إليك العلامة لتكوين حدود حجم رأس الطلب في 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
نوصي بالاستجابة لمستخدميك باستخدام صيغة تفاصيل المشكلة لاستجابة واجهة برمجة التطبيقات.
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"
}
}
ترك بوابة وصولك تتعامل مع حدود حجم رؤوس الطلب
إذا كنت تستخدم بوابة واجهة برمجة التطبيقات، يمكنك بسهولة إضافة سياسة إلى خط أنابيب طلبك للتعامل مع هذا. إليك كيفية القيام بذلك باستخدام Zuplo:
انتقل إلى مسارك في مصمم المسار وانقر على إضافة سياسة في خط أنابيب الطلب.
في نافذة اختيار السياسة، لدينا خياران اعتمادًا على ما تريد القيام به.
- تحديد حجم الطلب بالكامل باستخدام سياسة حد حجم الطلب.
- استخدم سياسة كود مخصص الداخلية وانسخ عينة الكود من الأعلى (باستثناء الأجزاء السريعة) إلى وحدة تايبسكريبت التي ستتم ربطها بالسياسة.
الخلاصة
خطأ HTTP 431 غالبًا ما يتم تفعيله بسبب رؤوس الطلبات الكبيرة جدًا. يمكنك تجنب مواجهة هذا الخطأ من خلال تحسين رؤوسك، وتقليلها عند الحاجة، وتنفيذ حدود حجم رؤوس الطلبات في واجهات برمجة التطبيقات الخاصة بك.
بالإضافة إلى ذلك، تنفيذ فحوصات حدود حجم الرؤوس في واجهة برمجة التطبيقات الخاصة بك أمر بسيط. معظم الخوادم تشمل بالفعل الإعدادات الافتراضية، ويمكنك أيضًا القيام بذلك بنفسك على كل من المستوى التراكمي والمستوى الفردي للرؤوس من داخل مسارات واجهة برمجة التطبيقات الخاصة بك.
Source:
https://dzone.com/articles/understanding-the-http-431-error