สูงสุดสำหรับค่าส่วนหัว 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.