ความยาวสูงสุดที่เป็นไปได้ของสตริงแบบสอบถามคืออะไร


559

มันขึ้นอยู่กับเบราว์เซอร์หรือไม่? นอกจากนี้สแต็คเว็บที่แตกต่างกันมีข้อ จำกัด ที่แตกต่างกันในการรับข้อมูลจากคำขอจำนวนเท่าใด


คุณสามารถตรวจสอบstackoverflow.com/questions/417142/
Xinus

มันมีไว้สำหรับคำขอ GET เท่านั้น! ขนาดสูงสุดของคำขอ POST (ไม่ว่าจะมีหรือไม่มีหลายส่วน / แบบฟอร์มข้อมูล) อยู่ที่นี่แล้ว!
peterh - Reinstate Monica

คำตอบ:


996

RFC 2616 (Hypertext Transfer Protocol - HTTP / 1.1) ระบุว่าไม่มีความยาวของสตริงการสืบค้น (ส่วน 3.2.1) RFC 3986 (Uniform Resource Identifier - URI) ยังระบุว่าไม่มีขีด จำกัด แต่ระบุว่าชื่อโฮสต์ถูก จำกัด ที่ 255 อักขระเนื่องจากข้อ จำกัด DNS (ส่วน 2.3.3)

ในขณะที่ข้อมูลจำเพาะไม่ได้ระบุความยาวสูงสุดขีด จำกัด ในทางปฏิบัติถูกกำหนดโดยเว็บเบราว์เซอร์และซอฟต์แวร์เซิร์ฟเวอร์ จากการวิจัยซึ่งน่าเสียดายที่ไม่มีให้บริการในไซต์ดั้งเดิมอีกต่อไป (นำไปสู่ไซต์ยืมที่ดูร่มรื่น) แต่ยังสามารถพบได้ที่Internet Archive Of Boutell.com :

  • Microsoft Internet Explorer (เบราว์เซอร์)
    Microsoft ระบุว่าความยาวสูงสุดของ URL ใน Internet Explorer คือ 2,083 ตัวอักษรโดยมีความยาวไม่เกิน 2,048 อักขระในส่วนเส้นทางของ URL ความพยายามในการใช้ URL ที่ยาวกว่านี้ทำให้เกิดข้อผิดพลาดที่ชัดเจนใน Internet Explorer

  • Microsoft Edge (เบราว์เซอร์)
    ขีด จำกัด มีความยาวประมาณ 81578 ตัวอักษร ดูข้อจำกัดความยาวของ URL ของ Microsoft Edge

  • Chrome
    มันหยุดแสดง URL หลังตัวอักษร 64k แต่สามารถแสดงได้มากกว่า 100k ตัวอักษร ไม่มีการทดสอบเพิ่มเติมใด ๆ

  • Firefox (เบราว์เซอร์)
    หลังจาก 65,536 ตัวอักษรแถบตำแหน่งจะไม่แสดง URL ใน Windows Firefox 1.5.x อีกต่อไป อย่างไรก็ตาม URL ที่ยาวขึ้นจะใช้งานได้ ไม่มีการทดสอบเพิ่มเติมหลังจาก 100,000 ตัวอักษร

  • Safari (เบราว์เซอร์)
    อย่างน้อย 80,000 ตัวอักษรจะทำงาน การทดสอบไม่ได้ถูกลองมากกว่านั้น

  • Opera (เบราว์เซอร์)
    อย่างน้อย 190,000 ตัวอักษรจะทำงานได้ หยุดการทดสอบหลังจาก 190,000 ตัวอักษร Opera 9 สำหรับ Windows ยังคงแสดง URL ที่สามารถแก้ไขได้คัดลอกและวางได้อย่างสมบูรณ์ในแถบตำแหน่งแม้จะมีความยาว 190,000 อักขระ

  • Apache (เซิร์ฟเวอร์)
    ความพยายามในการวัดความยาว URL สูงสุดในเว็บเบราว์เซอร์ในช่วงแรกนั้นจำกัดความยาว URL ของเซิร์ฟเวอร์ประมาณ 4,000 ตัวอักษรหลังจากนั้น Apache จะสร้างข้อผิดพลาด "413 Entity Too Large" มีการสร้าง Apache รุ่นล่าสุดที่พบใน Red Hat Enterprise Linux 4 เอกสาร Apache อย่างเป็นทางการกล่าวถึงข้อ จำกัด 8,192 ไบต์ในแต่ละฟิลด์ในคำขอ

  • เซิร์ฟเวอร์ข้อมูลทางอินเทอร์เน็ตของ Microsoft (เซิร์ฟเวอร์)
    ขีด จำกัด เริ่มต้นคือ 16,384 อักขระ (ใช่เว็บเซิร์ฟเวอร์ของ Microsoft ยอมรับ URL ที่ยาวกว่าเว็บเบราว์เซอร์ของ Microsoft) สิ่งนี้สามารถกำหนดค่าได้

  • Perl HTTP :: Daemon (เซิร์ฟเวอร์)
    สูงสุด 8,000 ไบต์จะใช้งานได้ ผู้ที่สร้างเว็บแอพพลิเคชันเซิร์ฟเวอร์ด้วยโมดูล HTTP :: Daemon ของ Perl จะพบข้อ จำกัด 16,384 ไบต์ในขนาดที่รวมกันของส่วนหัวคำขอ HTTP ทั้งหมด สิ่งนี้ไม่รวมถึงข้อมูลในแบบฟอร์มวิธี POST การอัพโหลดไฟล์ ฯลฯ แต่จะรวมถึง URL ด้วย ในทางปฏิบัติสิ่งนี้ส่งผลให้เกิดข้อผิดพลาด 413 เมื่อ URL มีความยาวมากกว่า 8,000 ตัวอักษรอย่างมีนัยสำคัญ ข้อ จำกัด นี้สามารถนำออกได้ง่าย ค้นหาการเกิดขึ้นทั้งหมดของ 16x1024 ใน Daemon.pm และแทนที่ด้วยค่าที่มากขึ้น แน่นอนว่านี่เป็นการเพิ่มการเปิดเผยของคุณต่อการปฏิเสธการโจมตีบริการ


8
ทำไมคุณไม่พูดหมายเลขรุ่นแทน "Microsoft Internet Explorer (เบราว์เซอร์)"?
LCJ

5
ปรากฏว่าเริ่มต้น IIS ขีด จำกัด ในการแบบสอบถาม String อย่างมีนัยสำคัญน้อยกว่า 16,384 ตัวอักษร - ยกมาเป็น 2048 นี่: iis.net/configreference/system.webserver/security/...
JTech


ฉันคิดว่าคุณทำประเภทและข้อ จำกัด DNS จะกล่าวถึงในส่วน "3.2.2. โฮสต์" ของ RFC3986 ไม่ใช่ 2.2.3 "ผู้ผลิต URI ควรใช้ชื่อที่สอดคล้องกับไวยากรณ์ DNS แม้ว่าการใช้ DNS จะไม่ปรากฏขึ้นทันทีและควร จำกัด ชื่อเหล่านี้ให้มีความยาวไม่เกิน 255 อักขระ"
Craig Hicks

ทำให้เกิดjava.lang.IllegalArgumentException: Request header is too largeในเซิร์ฟเวอร์แอปพลิเคชันบูตฤดูใบไม้ผลิ
Paramvir Singh Karwal

12

แม้ว่าอย่างเป็นทางการจะไม่มีการ จำกัด ที่ระบุโดย RFC 2616 โปรโตคอลความปลอดภัยจำนวนมากและคำแนะนำระบุว่า maxQueryStrings บนเซิร์ฟเวอร์ควรตั้งค่าความยาวสูงสุดของอักขระสูงสุด 1024 ในขณะที่ URL ทั้งหมดรวมถึงการสืบค้นควรตั้งค่าสูงสุด 2048 ตัวละคร นี่คือเพื่อป้องกันช่องโหว่ DDOS ช้า HTTP ร้องขอบนเว็บเซิร์ฟเวอร์ โดยทั่วไปแล้วสิ่งนี้จะแสดงให้เห็นว่าเป็นช่องโหว่ของ Qualys Web Application Scanner และสแกนเนอร์ความปลอดภัยอื่น ๆ

โปรดดูตัวอย่างรหัสด้านล่างสำหรับ Windows IIS Servers ด้วย Web.config:

<system.webServer>
<security>
    <requestFiltering>
        <requestLimits maxQueryString="1024" maxUrl="2048">
           <headerLimits>
              <add header="Content-type" sizeLimit="100" />
           </headerLimits>
        </requestLimits>
     </requestFiltering>
</security>
</system.webServer>

สิ่งนี้จะทำงานในระดับเซิร์ฟเวอร์โดยใช้ machine.config

หมายเหตุ: การ จำกัด สตริงข้อความค้นหาและความยาว URL อาจไม่สมบูรณ์ป้องกันคำขอ HTTP ช้าการโจมตี DDOS แต่เป็นขั้นตอนเดียวที่คุณสามารถทำได้เพื่อป้องกัน


2
และตอนนี้ฉันมีเหตุผลที่ฉันสามารถบอกวิศวกรแบ็กเอนด์ว่าเราจะไม่ยอมรับรายชื่อ UUID ตัวละครหนึ่งร้อย 36 ตัวในแบบสอบถาม Parameter ของคำขอ GET ขอบคุณ!
Mordred

1

สแต็คเว็บที่แตกต่างกันรองรับความยาวของคำขอ http ที่แตกต่างกัน ฉันรู้จากประสบการณ์ว่าสแต็คแรก ๆ ของ Safari รองรับเฉพาะอักขระ 4000 ตัวเท่านั้นดังนั้นจึงลำบากในการจัดการหน้า ASP.net เนื่องจาก USER-STATE นี่เป็นเพียง POST ดังนั้นคุณจะต้องตรวจสอบเบราว์เซอร์และดูว่าขีด จำกัด ของสแต็กคืออะไร ฉันคิดว่าคุณอาจถึงขีด จำกัด แม้ในเบราว์เซอร์ที่ใหม่กว่า ฉันจำไม่ได้ แต่มีหนึ่งในนั้น (IE6 ฉันคิดว่า) มีขีด จำกัด 16 บิต 32,768 หรืออะไรบางอย่าง

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