สูงสุดสำหรับค่าส่วนหัว http หรือไม่


326

มีขนาดสูงสุดที่อนุญาตสำหรับส่วนหัว HTTP หรือไม่ ถ้าเป็นเช่นนั้นมันคืออะไร? ถ้าไม่ใช่นี่เป็นสิ่งที่เฉพาะเซิร์ฟเวอร์หรือเป็นมาตรฐานที่ยอมรับเพื่อให้ส่วนหัวของขนาดใด ๆ

คำตอบ:


316

ไม่ HTTP ไม่ได้กำหนดขีด จำกัด ใด ๆ อย่างไรก็ตามเว็บเซิร์ฟเวอร์ส่วนใหญ่จะ จำกัด ขนาดของส่วนหัวที่พวกเขายอมรับ ยกตัวอย่างเช่นในวงเงินเริ่มต้น Apacheเป็น 8KB ในIIS ก็ 16K เซิร์ฟเวอร์จะส่งคืน413 Entity Too Largeข้อผิดพลาดหากขนาดส่วนหัวเกินขีด จำกัด นั้น

คำถามที่เกี่ยวข้อง: สตริงตัวแทนของผู้ใช้สามารถรับได้เท่าใด


10
คำตอบนี้ระบุว่าส่วนหัวขนาดสูงสุดที่เซิร์ฟเวอร์ยอมรับ แต่ขนาดส่วนหัวสูงสุดที่เว็บเซิร์ฟเวอร์ (เช่น Apache) สามารถส่งคืออะไร?
Pacerier

@Pacerier: นั่นคือ 8175 ไบต์สำหรับ Apache ดูเหมือนว่า แต่ฉันยังคงค้นหาอยู่ นอกจากนี้อย่าคาดหวังว่าจะได้รับข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์หากคุณพบเจอข้อ จำกัด จากแบ็กเอนด์อะไรก็ตาม
hakre

2
@hakre: IIRC, 8K สำหรับทั้งบรรทัดนับจำนวนบรรทัดส่วนหัวทั้งหมด (ชื่อส่วนหัวพื้นที่สีขาวและส่วนของข้อมูลส่วนหัว)
vartec

มีวิธีกำหนดขนาดสูงสุดที่กำหนดเองของส่วนหัวหรือไม่
Sudip Bolakhe

IIS น่าจะเปิดถึง 16k เนื่องจากข้อกำหนดโปรโตคอล SPNego และ Kerberos และพวกเขามักจะใช้สำหรับ "การรับรองความถูกต้องของ Windows"
Ronan Kerdudou

220

ตามที่ 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


6
สำหรับ apache2 ความยาว URL จะถูกควบคุมLimitRequestLineและLimitRequestFieldSizeนำไปใช้กับบรรทัดส่วนหัว HTTP แต่ละบรรทัด ... ไม่ใช่ "ผลรวมของ ... "
Yves Martin

1
คุกกี้มีขนาด จำกัด ทั้งหมด 4093 ไบต์ โดยแยกต่างหาก stackoverflow.com/questions/640938/…
Jeff Lowery

25
ไม่จำเป็นต้องเขียนโค้ดเพื่อให้ได้ขนาดหน้ากระดาษ จากสถานี: getconf PAGESIZE
Ponytech

6
สิ่งนี้อาจมีการเปลี่ยนแปลงตั้งแต่เขียนคำตอบนี้ แต่หน้า nginx ที่เชื่อมโยงไม่ตรงกับคำตอบ หน้า nginx ระบุว่าขนาดบัฟเฟอร์เริ่มต้นคือ 8k และการร้องขอสามารถใช้ 4 บัฟเฟอร์โดยค่าเริ่มต้น (ขนาดบัฟเฟอร์เอง จำกัด ขนาดของบรรทัดคำขอและแต่ละส่วนหัวแต่ละรายการ) ดังนั้นสิ่งนี้ชี้ให้เห็นว่า nginx อนุญาตให้อยู่ระหว่าง 16-32k (ฉันสมมติว่าหนึ่งบรรทัดไม่สามารถแยกข้ามสองบัฟเฟอร์ดังนั้นบัฟเฟอร์อาจไม่เต็มจนเต็ม)
Lily Ballard

เพิ่มค่าใน apache 2.4 ซึ่งยังคงเหมือนเดิม: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah

5

HTTP ไม่ได้กำหนดขีด จำกัด ที่กำหนดไว้ล่วงหน้าเกี่ยวกับความยาวของแต่ละฟิลด์ส่วนหัวหรือความยาวของส่วนหัวโดยรวมตามที่อธิบายไว้ในส่วน 2.5 ข้อ จำกัด เฉพาะกิจต่าง ๆ เกี่ยวกับความยาวฟิลด์ส่วนหัวแต่ละรายการพบได้ในทางปฏิบัติบ่อยครั้งขึ้นอยู่กับความหมายของฟิลด์เฉพาะ

ค่า HTTP Header ถูก จำกัด โดยการใช้งานเซิร์ฟเวอร์ ข้อมูลจำเพาะ Http ไม่ได้ จำกัด ขนาดส่วนหัว

เซิร์ฟเวอร์ที่ได้รับฟิลด์ส่วนหัวคำขอหรือชุดของฟิลด์ที่ใหญ่กว่าที่ต้องการประมวลผลต้องตอบสนองด้วยรหัสสถานะ 4xx (ข้อผิดพลาดไคลเอ็นต์) ที่เหมาะสม การไม่สนใจฟิลด์ส่วนหัวดังกล่าวจะเพิ่มความเสี่ยงของเซิร์ฟเวอร์เพื่อขอให้มีการโจมตีการลักลอบขนสินค้า (มาตรา 9.5)

เซิร์ฟเวอร์ส่วนใหญ่จะกลับมา413 Entity Too Largeหรือข้อผิดพลาด 4xx ที่เหมาะสมเมื่อเกิดเหตุการณ์นี้

ไคลเอนต์อาจละทิ้งหรือตัดทอนเขตข้อมูลส่วนหัวที่ได้รับซึ่งมีขนาดใหญ่กว่าไคลเอนต์ที่ต้องการประมวลผลถ้าความหมายของเขตข้อมูลเป็นเช่นนั้นค่าที่ถูกทิ้งสามารถถูกละเว้นได้อย่างปลอดภัยโดยไม่ต้องเปลี่ยนกรอบข้อความ

ขนาดส่วนหัว HTTP ที่ไม่ได้ใช้ทำให้เซิร์ฟเวอร์ไม่ถูกโจมตีและสามารถลดความสามารถในการรับส่งข้อมูลทั่วไป

แหล่ง


2

นี่คือข้อ จำกัด ของเว็บเซิร์ฟเวอร์ยอดนิยมที่สุด

  • Apache - 8K
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Tomcat - 8K - 48K

1

ฉันยังพบว่าในบางกรณีเหตุผลสำหรับ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.