Nilai header http maksimum?

326

Apakah ada ukuran maksimum yang diizinkan untuk header HTTP? Jika demikian, apakah itu? Jika tidak, apakah ini sesuatu yang spesifik untuk server atau standar yang diterima untuk memungkinkan header dengan ukuran berapa pun?

Cory
sumber

Jawaban:

316

Tidak, HTTP tidak mendefinisikan batas apa pun. Namun sebagian besar server web membatasi ukuran tajuk yang mereka terima. Misalnya di batas default Apache adalah 8KB, di IIS 16K . Server akan kembali413 Entity Too Large kesalahan jika ukuran header melebihi batas itu.

Pertanyaan terkait: Seberapa besar string agen pengguna bisa didapat?

vartec
sumber
10
Jawaban ini menyatakan bahwa ukuran tajuk maksimum yang diterima oleh server. Tetapi berapa ukuran header maksimum yang bisa dikirim oleh server web (mis. Apache)?
Pacerier
@Aceracer: Sepertinya 8175 byte untuk Apache, tapi saya masih mencari. Juga jangan berharap untuk mendapatkan pesan kesalahan yang berguna jika Anda mengalami batas seperti itu dari backend apa pun itu.
hakre
2
@hakre: IIRC, 8K untuk seluruh baris, menghitung seluruh baris header (nama header, white-space, dan payload header).
vartec
Apakah ada cara untuk menentukan ukuran maks khusus header?
Sudip Bolakhe
Mungkin IIS terbuka untuk 16k karena persyaratan protokol SPNego dan Kerberos, dan mereka sering digunakan untuk "otentikasi Windows".
Ronan Kerdudou
220

Seperti yang dikatakan vartec di atas, spesifikasi HTTP tidak menentukan batas, namun banyak server melakukannya secara default. Ini berarti, secara praktis, batas bawah adalah 8K . Untuk sebagian besar server, batas ini berlaku untuk jumlah baris permintaan dan SEMUA bidang tajuk (jadi singkatkan cookie Anda).

Perlu dicatat bahwa nginx menggunakan ukuran halaman sistem secara default, yaitu 4K pada kebanyakan sistem. Anda dapat memeriksa dengan program kecil ini:

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;
}

Kompilasi dengan gcc -o pagesize pagesize.ckemudian jalankan ./pagesize. Server ubuntu saya dari Linode dengan patuh memberi tahu saya bahwa jawabannya adalah 4k.

David Schoonover
sumber
6
Untuk apache2, panjang URL dikendalikan oleh LimitRequestLinedan LimitRequestFieldSizeberlaku untuk setiap baris tajuk HTTP secara perorangan ... bukan "jumlah ..."
Yves Martin
1
Cookie memiliki batas ukuran total terpisah 4093 byte. stackoverflow.com/questions/640938/…
Jeff Lowery
25
Tidak perlu menulis kode untuk mendapatkan ukuran halaman. Dari terminal: getconf PAGESIZE
Ponytech
6
Ini mungkin telah berubah sejak jawaban ini ditulis, tetapi halaman nginx yang tertaut tidak cocok dengan jawabannya. Halaman nginx menunjukkan bahwa ukuran buffer default adalah 8k, dan bahwa permintaan dapat menggunakan 4 buffer secara default (ukuran buffer itu sendiri membatasi ukuran baris permintaan dan setiap header individu). Jadi ini menunjukkan bahwa nginx memungkinkan suatu tempat antara 16-32k (saya berasumsi satu baris tidak dapat dibagi menjadi dua buffer, jadi buffer mungkin tidak dapat diisi sepenuhnya).
Lily Ballard
menambahkan nilai pada apache 2.4 yang tetap sama: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2.2.4: 8K
Med Ali Difallah
5

HTTP tidak menempatkan batas yang telah ditentukan pada panjang setiap bidang tajuk atau pada panjang bagian tajuk secara keseluruhan, seperti yang dijelaskan dalam Bagian 2.5. Berbagai batasan ad hoc pada panjang bidang tajuk individual ditemukan dalam praktik, seringkali tergantung pada semantik bidang tertentu.

Nilai HTTP Header dibatasi oleh implementasi server. Spesifikasi Http tidak membatasi ukuran tajuk.

Server yang menerima bidang tajuk permintaan, atau kumpulan bidang, lebih besar dari yang diinginkannya untuk memproses HARUS merespons dengan kode status 4xx (Kesalahan Klien) yang sesuai. Mengabaikan bidang header seperti itu akan meningkatkan kerentanan server untuk meminta serangan penyelundupan (Bagian 9.5).

Sebagian besar server akan kembali 413 Entity Too Largeatau sesuai kesalahan 4xx ketika ini terjadi.

Klien MUNGKIN membuang atau memotong bidang tajuk yang diterima yang lebih besar dari yang ingin diproses oleh klien jika semantik bidang sedemikian rupa sehingga nilai yang dijatuhkan dapat diabaikan dengan aman tanpa mengubah pembingkaian pesan atau semantik respons.

Ukuran header HTTP yang tidak tertutup membuat server terekspos terhadap serangan dan dapat menurunkan kapasitasnya untuk melayani lalu lintas organik.

Sumber

realPK
sumber
2

Berikut adalah batasan server web paling populer

  • Apache - 8K
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Tomcat - 8K - 48K
Sarath Ak
sumber
1

Saya juga menemukan bahwa dalam beberapa kasus alasan 502/400 dalam kasus banyak header bisa jadi karena sejumlah besar header tanpa memperhatikan ukuran. dari dokumen

tune.http.maxhdr Menetapkan jumlah header maksimum dalam permintaan. Ketika permintaan datang dengan sejumlah tajuk yang lebih besar dari nilai ini (termasuk baris pertama), itu ditolak dengan kode status "400 Permintaan Buruk". Demikian pula, respons yang terlalu besar diblokir dengan "502 Bad Gateway". Nilai default adalah 101, yang cukup untuk semua penggunaan, mengingat bahwa server Apache yang digunakan secara luas menggunakan batas yang sama. Ini dapat berguna untuk mendorong batas ini lebih jauh untuk sementara waktu memungkinkan aplikasi kereta bekerja pada saat itu diperbaiki. Ingatlah bahwa setiap tajuk baru menghabiskan memori 32 bit untuk setiap sesi, jadi jangan memaksakan batas ini terlalu tinggi.

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

Shay Rybak
sumber