มีขนาดสูงสุดที่อนุญาตสำหรับส่วนหัว HTTP หรือไม่ ถ้าเป็นเช่นนั้นมันคืออะไร? ถ้าไม่ใช่นี่เป็นสิ่งที่เฉพาะเซิร์ฟเวอร์หรือเป็นมาตรฐานที่ยอมรับเพื่อให้ส่วนหัวของขนาดใด ๆ
มีขนาดสูงสุดที่อนุญาตสำหรับส่วนหัว HTTP หรือไม่ ถ้าเป็นเช่นนั้นมันคืออะไร? ถ้าไม่ใช่นี่เป็นสิ่งที่เฉพาะเซิร์ฟเวอร์หรือเป็นมาตรฐานที่ยอมรับเพื่อให้ส่วนหัวของขนาดใด ๆ
คำตอบ:
ไม่ HTTP ไม่ได้กำหนดขีด จำกัด ใด ๆ อย่างไรก็ตามเว็บเซิร์ฟเวอร์ส่วนใหญ่จะ จำกัด ขนาดของส่วนหัวที่พวกเขายอมรับ ยกตัวอย่างเช่นในวงเงินเริ่มต้น Apacheเป็น 8KB ในIIS ก็ 16K เซิร์ฟเวอร์จะส่งคืน413 Entity Too Large
ข้อผิดพลาดหากขนาดส่วนหัวเกินขีด จำกัด นั้น
คำถามที่เกี่ยวข้อง: สตริงตัวแทนของผู้ใช้สามารถรับได้เท่าใด
ตามที่ vartec กล่าวไว้ข้างต้นข้อมูลจำเพาะของ HTTP ไม่ได้กำหนดขีด จำกัด อย่างไรก็ตามเซิร์ฟเวอร์ส่วนใหญ่จะทำตามค่าเริ่มต้น วิธีนี้พูดจริงขีด จำกัด ล่างคือ8K สำหรับเซิร์ฟเวอร์ส่วนใหญ่ข้อ จำกัด นี้จะใช้กับผลรวมของบรรทัดคำขอและฟิลด์ส่วนหัวทั้งหมด (เพื่อให้คุกกี้ของคุณสั้น)
เป็นที่น่าสังเกตว่า nginx ใช้ขนาดหน้าของระบบเป็นค่าเริ่มต้นซึ่งก็คือ 4K บนระบบส่วนใหญ่ คุณสามารถตรวจสอบด้วยโปรแกรมเล็ก ๆ นี้:
pagesize.c:
#include <unistd.h>
#include <stdio.h>
int main() {
int pageSize = getpagesize();
printf("Page size on your system = %i bytes\n", pageSize);
return 0;
}
รวบรวมแล้ววิ่งgcc -o pagesize pagesize.c
./pagesize
เซิร์ฟเวอร์ ubuntu ของฉันจากLinode ทำหน้าที่แจ้งให้ฉันทราบว่าคำตอบคือ 4k
LimitRequestLine
และLimitRequestFieldSize
นำไปใช้กับบรรทัดส่วนหัว HTTP แต่ละบรรทัด ... ไม่ใช่ "ผลรวมของ ... "
HTTP ไม่ได้กำหนดขีด จำกัด ที่กำหนดไว้ล่วงหน้าเกี่ยวกับความยาวของแต่ละฟิลด์ส่วนหัวหรือความยาวของส่วนหัวโดยรวมตามที่อธิบายไว้ในส่วน 2.5 ข้อ จำกัด เฉพาะกิจต่าง ๆ เกี่ยวกับความยาวฟิลด์ส่วนหัวแต่ละรายการพบได้ในทางปฏิบัติบ่อยครั้งขึ้นอยู่กับความหมายของฟิลด์เฉพาะ
ค่า HTTP Header ถูก จำกัด โดยการใช้งานเซิร์ฟเวอร์ ข้อมูลจำเพาะ Http ไม่ได้ จำกัด ขนาดส่วนหัว
เซิร์ฟเวอร์ที่ได้รับฟิลด์ส่วนหัวคำขอหรือชุดของฟิลด์ที่ใหญ่กว่าที่ต้องการประมวลผลต้องตอบสนองด้วยรหัสสถานะ 4xx (ข้อผิดพลาดไคลเอ็นต์) ที่เหมาะสม การไม่สนใจฟิลด์ส่วนหัวดังกล่าวจะเพิ่มความเสี่ยงของเซิร์ฟเวอร์เพื่อขอให้มีการโจมตีการลักลอบขนสินค้า (มาตรา 9.5)
เซิร์ฟเวอร์ส่วนใหญ่จะกลับมา413 Entity Too Large
หรือข้อผิดพลาด 4xx ที่เหมาะสมเมื่อเกิดเหตุการณ์นี้
ไคลเอนต์อาจละทิ้งหรือตัดทอนเขตข้อมูลส่วนหัวที่ได้รับซึ่งมีขนาดใหญ่กว่าไคลเอนต์ที่ต้องการประมวลผลถ้าความหมายของเขตข้อมูลเป็นเช่นนั้นค่าที่ถูกทิ้งสามารถถูกละเว้นได้อย่างปลอดภัยโดยไม่ต้องเปลี่ยนกรอบข้อความ
ขนาดส่วนหัว HTTP ที่ไม่ได้ใช้ทำให้เซิร์ฟเวอร์ไม่ถูกโจมตีและสามารถลดความสามารถในการรับส่งข้อมูลทั่วไป
นี่คือข้อ จำกัด ของเว็บเซิร์ฟเวอร์ยอดนิยมที่สุด
ฉันยังพบว่าในบางกรณีเหตุผลสำหรับ 502/400 ในกรณีส่วนหัวอาจเป็นเพราะส่วนหัวจำนวนมากโดยไม่คำนึงถึงขนาด จากเอกสาร
tune.http.maxhdr ตั้งค่าจำนวนสูงสุดของส่วนหัวในคำขอ เมื่อคำขอมาพร้อมกับส่วนหัวจำนวนมากกว่าค่านี้ (รวมถึงบรรทัดแรก) คำขอนั้นจะถูกปฏิเสธด้วยรหัสสถานะ "400 คำขอไม่ถูกต้อง" ในทำนองเดียวกันคำตอบที่ใหญ่เกินไปจะถูกบล็อกด้วย "502 Bad Gateway" ค่าเริ่มต้นคือ 101 ซึ่งเพียงพอสำหรับการใช้งานทั้งหมดโดยพิจารณาว่าเซิร์ฟเวอร์ Apache ที่ใช้งานกันอย่างแพร่หลายนั้นใช้ขีด จำกัด เดียวกัน มันจะมีประโยชน์ในการผลักดันขีด จำกัด นี้ต่อไปเพื่อให้แอปพลิเคชัน buggy ทำงานชั่วคราวตามเวลาที่ได้รับการแก้ไข โปรดทราบว่าแต่ละส่วนหัวใหม่ใช้หน่วยความจำ 32 บิตสำหรับแต่ละเซสชันดังนั้นอย่าดันขีด จำกัด นี้ให้สูงเกินไป
https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr