Tối đa trên giá trị tiêu đề http?


326

Có kích thước tối đa được phép chấp nhận cho các tiêu đề HTTP không? Nếu vậy, nó là cái gì? Nếu không, đây có phải là thứ gì đó cụ thể của máy chủ hay là tiêu chuẩn được chấp nhận để cho phép các tiêu đề có kích thước bất kỳ?

Câu trả lời:


316

Không, HTTP không xác định bất kỳ giới hạn nào. Tuy nhiên, hầu hết các máy chủ web đều giới hạn kích thước của các tiêu đề mà họ chấp nhận. Ví dụ: trong giới hạn mặc định của Apache là 8KB, trong IIS là 16K . Máy chủ sẽ trở lại413 Entity Too Large lỗi nếu kích thước tiêu đề vượt quá giới hạn đó.

Câu hỏi liên quan: Làm thế nào lớn một chuỗi tác nhân người dùng có thể nhận được?


10
Câu trả lời này nói rằng kích thước tiêu đề được chấp nhận tối đa bởi máy chủ. Nhưng kích thước tiêu đề tối đa mà máy chủ web (ví dụ Apache) có khả năng gửi là bao nhiêu?
Pacerier

@Pacerier: Đó là 8175 byte cho Apache, nhưng tôi vẫn đang tìm kiếm. Cũng đừng mong nhận được thông báo lỗi hữu ích nếu bạn gặp phải giới hạn như vậy từ bất kỳ phụ trợ nào.
hakre

2
@hakre: IIRC, 8K cho toàn bộ dòng, tính toàn bộ dòng tiêu đề (tên tiêu đề, khoảng trắng và tải trọng của tiêu đề).
vartec

Có cách nào để xác định kích thước tối đa tùy chỉnh của tiêu đề không?
Sudip Bolakhe

Có lẽ IIS mở tới 16k vì yêu cầu giao thức SPNego và Kerberos và chúng thường được sử dụng để "xác thực Windows".
Ronan Kerdudou

220

Như vartec đã nói ở trên, thông số HTTP không xác định giới hạn, tuy nhiên nhiều máy chủ thực hiện theo mặc định. Điều này có nghĩa, thực tế mà nói, giới hạn dưới là 8K . Đối với hầu hết các máy chủ, giới hạn này áp dụng cho tổng của dòng yêu cầu và TẤT CẢ các trường tiêu đề (vì vậy hãy giữ cookie của bạn ngắn).

Điều đáng chú ý là nginx sử dụng kích thước trang hệ thống theo mặc định, là 4K trên hầu hết các hệ thống. Bạn có thể kiểm tra với chương trình nhỏ này:

pageize.c:

#include <unistd.h>
#include <stdio.h>

int main() {
    int pageSize = getpagesize();
    printf("Page size on your system = %i bytes\n", pageSize);
    return 0;
}

Biên dịch với gcc -o pagesize pagesize.csau đó chạy ./pagesize. Máy chủ Ubuntu của tôi từ Linode đàng hoàng thông báo cho tôi câu trả lời là 4k.


6
Đối với apache2, độ dài URL được kiểm soát bởi LimitRequestLineLimitRequestFieldSizeáp dụng cho từng dòng tiêu đề HTTP một cách ngẫu nhiên ... không phải là "tổng của ..."
Yves Martin

1
Cookies có giới hạn tổng kích thước riêng biệt là 4093 byte. stackoverflow.com/questions/640938/ cường
Jeff Lowery

25
Không cần phải viết mã để có được kích thước trang. Từ một thiết bị đầu cuối: getconf PAGESIZE
Ponytech 11/03/2015

6
Điều này có lẽ đã thay đổi kể từ khi câu trả lời này được viết, nhưng trang nginx được liên kết không khớp với câu trả lời. Trang nginx chỉ ra rằng kích thước bộ đệm mặc định là 8k và yêu cầu có thể sử dụng 4 bộ đệm theo mặc định (chính kích thước bộ đệm giới hạn kích thước của dòng yêu cầu và từng tiêu đề riêng lẻ). Vì vậy, điều này cho thấy nginx cho phép một nơi nào đó trong khoảng 16-32k (Tôi giả sử một dòng không thể được chia thành hai bộ đệm, vì vậy bộ đệm có thể không được lấp đầy hết cỡ).
Lily Ballard

thêm giá trị trên apache 2.4 vẫn giữ nguyên: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah

5

HTTP không đặt giới hạn được xác định trước về độ dài của từng trường tiêu đề hoặc trên toàn bộ chiều dài của phần tiêu đề, như được mô tả trong Phần 2.5. Các giới hạn ad hoc khác nhau về độ dài trường tiêu đề riêng lẻ được tìm thấy trong thực tế, thường phụ thuộc vào ngữ nghĩa trường cụ thể.

Giá trị HTTP Header bị hạn chế bởi việc triển khai máy chủ. Thông số kỹ thuật http không giới hạn kích thước tiêu đề.

Máy chủ nhận trường tiêu đề yêu cầu hoặc bộ trường lớn hơn yêu cầu xử lý PHẢI trả lời bằng mã trạng thái 4xx (Lỗi khách hàng) thích hợp. Bỏ qua các trường tiêu đề như vậy sẽ làm tăng tính dễ bị tổn thương của máy chủ để yêu cầu các cuộc tấn công buôn lậu (Mục 9.5).

Hầu hết các máy chủ sẽ trả về 413 Entity Too Largehoặc lỗi 4xx thích hợp khi điều này xảy ra.

Một khách hàng CÓ THỂ loại bỏ hoặc cắt bớt các trường tiêu đề nhận được lớn hơn các máy khách muốn xử lý nếu ngữ nghĩa trường sao cho (các) giá trị bị bỏ qua có thể được bỏ qua một cách an toàn mà không thay đổi ngữ nghĩa khung hoặc thông báo phản hồi.

Kích thước tiêu đề HTTP chưa được mã hóa giữ cho máy chủ tiếp xúc với các cuộc tấn công và có thể giảm khả năng phục vụ lưu lượng truy cập không phải trả tiền.

Nguồn


2

Đây là giới hạn của hầu hết các máy chủ web phổ biến

  • Apache - 8K
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Mèo con - 8K - 48K

1

Tôi cũng thấy rằng trong một số trường hợp, lý do cho 502/400 trong trường hợp có nhiều tiêu đề có thể là do một số lượng lớn các tiêu đề mà không liên quan đến kích thước. từ các tài liệu

Tune.http.maxhdr Đặt số lượng tiêu đề tối đa trong một yêu cầu. Khi một yêu cầu đi kèm với một số tiêu đề lớn hơn giá trị này (bao gồm cả dòng đầu tiên), nó sẽ bị từ chối với mã trạng thái "400 Yêu cầu xấu". Tương tự, các phản hồi quá lớn sẽ bị chặn với "502 Bad Gateway". Giá trị mặc định là 101, đủ cho tất cả các cách sử dụng, xem xét rằng máy chủ Apache được triển khai rộng rãi sử dụng cùng một giới hạn. Nó có thể hữu ích để đẩy giới hạn này hơn nữa để tạm thời cho phép một ứng dụng lỗi hoạt động vào thời điểm nó được sửa chữa. Hãy nhớ rằng mỗi tiêu đề mới tiêu tốn 32 bit bộ nhớ cho mỗi phiên, vì vậy đừng đẩy giới hạn này quá cao.

https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr

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.