Độ dài tối đa có thể có của một chuỗi truy vấn là bao nhiêu?


558

Có phụ thuộc trình duyệt không? Ngoài ra, các ngăn xếp web khác nhau có giới hạn khác nhau về số lượng dữ liệu họ có thể nhận được từ yêu cầu không?


bạn cũng có thể kiểm tra stackoverflow.com/questions/417142/
Xinus

Nó chỉ dành cho các yêu cầu NHẬN! Kích thước tối đa của các yêu cầu POST (có hoặc không có nhiều dữ liệu / biểu mẫu) ở đây không xác định!
peterh - Phục hồi Monica

Câu trả lời:


995

RFC 2616 (Giao thức truyền siêu văn bản - HTTP / 1.1) không có giới hạn về độ dài của chuỗi truy vấn (phần 3.2.1). RFC 3986 (Mã định danh tài nguyên đồng nhất - URI) cũng cho biết không có giới hạn, nhưng chỉ ra tên máy chủ bị giới hạn ở 255 ký tự do giới hạn DNS (phần 2.3.3).

Mặc dù các thông số kỹ thuật không chỉ định bất kỳ độ dài tối đa nào, các giới hạn thực tế được áp đặt bởi trình duyệt web và phần mềm máy chủ. Dựa trên nghiên cứu không may không còn có sẵn trên trang web ban đầu của nó (dẫn đến một trang web cho vay có vẻ mờ ám) nhưng vẫn có thể tìm thấy tại Internet Archive Of Boutell.com :

  • Microsoft Internet Explorer (Trình duyệt)
    Microsoft tuyên bố rằng độ dài tối đa của URL trong Internet Explorer là 2.083 ký tự, với không quá 2.048 ký tự trong phần đường dẫn của URL. Nỗ lực sử dụng URL lâu hơn điều này tạo ra một thông báo lỗi rõ ràng trong Internet Explorer.

  • Microsoft Edge (Trình duyệt)
    Giới hạn xuất hiện là khoảng 81578 ký tự. Xem giới hạn độ dài URL của Microsoft Edge

  • Chrome
    Nó dừng hiển thị URL sau 64k ký tự, nhưng có thể phục vụ hơn 100 nghìn ký tự. Không có thử nghiệm nào được thực hiện ngoài đó.

  • Firefox (Trình duyệt)
    Sau 65.536 ký tự, thanh vị trí không còn hiển thị URL trong Windows Firefox 1.5.x. Tuy nhiên, các URL dài hơn sẽ hoạt động. Không có thử nghiệm nào được thực hiện sau 100.000 ký tự.

  • Safari (Trình duyệt)
    Ít nhất 80.000 ký tự sẽ hoạt động. Kiểm tra đã không được cố gắng ngoài đó.

  • Opera (Trình duyệt)
    Ít nhất 190.000 ký tự sẽ hoạt động. Dừng thử nghiệm sau 190.000 ký tự. Opera 9 cho Windows tiếp tục hiển thị một URL có thể chỉnh sửa, có thể sao chép và có thể chỉnh sửa hoàn toàn trong thanh vị trí ngay cả ở mức 190.000 ký tự.

  • Apache (Máy chủ)
    Những nỗ lực ban đầu để đo chiều dài URL tối đa trong các trình duyệt web đã bị giới hạn độ dài URL của máy chủ khoảng 4.000 ký tự, sau đó Apache tạo ra lỗi "413 Thực thể quá lớn". Bản dựng Apache hiện tại được tìm thấy trong Red Hat Enterprise Linux 4 đã được sử dụng. Tài liệu chính thức của Apache chỉ đề cập đến giới hạn 8.192 byte trên một trường riêng lẻ trong một yêu cầu.

  • Máy chủ thông tin Internet của Microsoft (Máy chủ)
    Giới hạn mặc định là 16.384 ký tự (có, máy chủ web của Microsoft chấp nhận URL dài hơn trình duyệt web của Microsoft). Đây là cấu hình.

  • Perl HTTP :: Daemon (Máy chủ)
    Tối đa 8.000 byte sẽ hoạt động. Những máy chủ ứng dụng web xây dựng với mô đun HTTP :: Daemon của Perl sẽ gặp giới hạn 16.384 byte trên kích thước kết hợp của tất cả các tiêu đề yêu cầu HTTP. Điều này không bao gồm dữ liệu biểu mẫu phương thức POST, tải lên tệp, v.v., nhưng nó bao gồm URL. Trong thực tế, điều này dẫn đến lỗi 413 khi URL dài hơn đáng kể hơn 8.000 ký tự. Hạn chế này có thể dễ dàng loại bỏ. Tìm kiếm tất cả các lần xuất hiện của 16x1024 trong Daemon.pm và thay thế chúng bằng một giá trị lớn hơn. Tất nhiên, điều này không làm tăng sự tiếp xúc của bạn đối với các cuộc tấn công từ chối dịch vụ.


8
Tại sao bạn không nói số phiên bản thay vì "Microsoft Internet Explorer (Trình duyệt)"?
LCJ

5
Dường như giới hạn IIS mặc định trên Chuỗi truy vấn nhỏ hơn đáng kể 16.384 ký tự - được trích dẫn là 2048 tại đây: iis.net/configreference/system.webserver/security/iêu
JTech


Tôi nghĩ rằng bạn đã tạo một loại và các giới hạn DNS được thảo luận trong phần "3.2.2. Máy chủ" của RFC3986, không phải 2.2.3. "Các nhà sản xuất URI nên sử dụng các tên phù hợp với cú pháp DNS, ngay cả khi việc sử dụng DNS không rõ ràng ngay lập tức và nên giới hạn các tên này có độ dài không quá 255 ký tự."
Craig Hicks

Nguyên nhân java.lang.IllegalArgumentException: Request header is too largetrên máy chủ ứng dụng khởi động mùa xuân tomcat.
Paramvir Singh Karwal

12

Mặc dù chính thức không có giới hạn được chỉ định bởi RFC 2616, nhiều giao thức và đề xuất bảo mật nêu rõ maxQueryStrings trên máy chủ nên được đặt thành giới hạn ký tự tối đa là 1024. Trong khi toàn bộ URL, bao gồm cả chuỗi truy vấn, nên được đặt ở mức tối đa là 2048 nhân vật. Điều này là để ngăn ngừa lỗ hổng DDOS Yêu cầu HTTP chậm trên máy chủ web. Điều này thường xuất hiện như một lỗ hổng trên Trình quét ứng dụng web Qualys và các trình quét bảo mật khác.

Vui lòng xem mã ví dụ bên dưới cho Máy chủ IIS Windows với Web.config:

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

Điều này cũng sẽ hoạt động ở cấp độ máy chủ bằng machine.config.

Lưu ý: Giới hạn chuỗi truy vấn và độ dài URL có thể không hoàn toàn ngăn chặn cuộc tấn công DDOS Yêu cầu HTTP chậm nhưng đây là một bước bạn có thể thực hiện để ngăn chặn.


2
Và bây giờ tôi có một lý do tôi có thể nói với các kỹ sư phụ trợ rằng chúng tôi sẽ không chấp nhận danh sách một trăm UUID 36 ký tự trong truy vấnParams của yêu cầu GET. Cảm ơn!
Sắp xếp

1

Các ngăn xếp web khác nhau hỗ trợ các yêu cầu http có độ dài khác nhau. Theo kinh nghiệm, tôi biết rằng các ngăn xếp ban đầu của Safari chỉ hỗ trợ 4000 ký tự và do đó gặp khó khăn khi xử lý các trang ASP.net vì NGƯỜI DÙNG-NHÀ NƯỚC. Điều này thậm chí là cho POST, vì vậy bạn sẽ phải kiểm tra trình duyệt và xem giới hạn ngăn xếp là gì. Tôi nghĩ rằng bạn có thể đạt đến giới hạn ngay cả trên các trình duyệt mới hơn. Tôi không thể nhớ nhưng một trong số họ (IE6, tôi nghĩ) có giới hạn 16 bit, 32.768 hoặc một cái gì đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.