Http başlık değerlerinde maksimum değer mi?


326

HTTP üstbilgileri için kabul edilen bir izin verilen maksimum boyut var mı? Eğer öyleyse, nedir? Değilse, bu sunucuya özgü bir şey mi yoksa herhangi bir boyuttaki başlıklara izin vermek için kabul edilen standart mı?

Yanıtlar:


316

Hayır, HTTP herhangi bir sınır tanımlamaz. Ancak, çoğu web sunucusu kabul ettikleri üstbilgilerin boyutunu sınırlar. Örneğin Apache'de varsayılan sınır 8 KB, IIS'de 16 KB'dir . 413 Entity Too LargeÜstbilgi boyutu bu sınırı aşarsa sunucu hata döndürür .

İlgili soru: Bir kullanıcı aracısı dizesi ne kadar büyük olabilir?


10
Bu cevap, sunucu tarafından kabul edilen maksimum başlık boyutunun olduğunu belirtir. Ancak web sunucusunun (örn. Apache) gönderebileceği maksimum başlık boyutu nedir?
Pacerier

@Pacerier: Apache için 8175 bayt gibi görünüyor, ama hala arıyorum. Ayrıca, herhangi bir arka uçtan böyle bir sınıra girerseniz yararlı hata mesajları almayı beklemeyin.
hakre

2
@ hakre: Tüm satır için IIRC, 8K, tüm başlık satırlarını (başlık adları, boşluk ve başlık yükleri) sayar.
vartec

Üstbilginin özel maksimum boyutunu tanımlamanın bir yolu var mı?
Sudip Bolakhe

Muhtemelen IIS, SPNego ve Kerberos protokolleri gereksinimleri nedeniyle 16k'ye açıktır ve genellikle "Windows kimlik doğrulaması" için kullanılır.
Ronan Kerdudou

220

Yukarıda vartec'in söylediği gibi, HTTP spesifikasyonu bir sınır tanımlamaz, ancak birçok sunucu varsayılan olarak yapar. Bu, pratik olarak, alt sınırın 8K olduğu anlamına gelir . Çoğu sunucu için bu sınır , istek satırı ve TÜM başlık alanlarının toplamı için geçerlidir (bu nedenle çerezlerinizi kısa tutun).

Nginx'in varsayılan olarak sistem sayfası boyutunu kullandığını ve çoğu sistemde 4K olduğunu belirtmek gerekir. Bu küçük programla kontrol edebilirsiniz:

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

Derleyin ve gcc -o pagesize pagesize.cçalıştırın ./pagesize. Linode'den ubuntu sunucum bana cevabın 4k olduğunu bildiriyor.


6
Apache2 için URL uzunluğu, her bir HTTP başlık satırı tarafından ayrı ayrı kontrol edilir LimitRequestLineve LimitRequestFieldSizeuygulanır ... "toplamı ..." değil
Yves Martin

1
Çerezlerin ayrı ayrı toplam boyut sınırı 4093 bayttır. stackoverflow.com/questions/640938/…
Jeff Lowery

25
Sayfa boyutunu elde etmek için kod yazmaya gerek yoktur. Bir terminalden:
getconf PAGESIZE

6
Bu yanıt yazıldığından beri bu muhtemelen değişti, ancak bağlantılı nginx sayfası cevapla eşleşmiyor. Nginx sayfası, varsayılan arabellek boyutunun 8k olduğunu ve isteğin varsayılan olarak 4 arabellek kullanabileceğini belirtir (arabellek boyutunun kendisi, istek satırının ve her bir üstbilginin boyutunu sınırlar). Yani bu, nginx'in 16-32k arasında bir yere izin verdiğini gösteriyor (bir satırın iki tampon arasında bölünemediğini varsayıyorum, bu nedenle tamponlar tamamen doldurulamayabilir).
Lily Ballard

aynı kalan apache 2.4'e değer ekleyerek: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah 4:17

5

HTTP, Bölüm 2.5'te açıklandığı gibi her başlık alanının uzunluğuna veya bir bütün olarak başlık bölümünün uzunluğuna önceden tanımlanmış bir sınır koymaz. Uygulamada, genellikle belirli alan semantiğine bağlı olarak, tek tek başlık alanı uzunluğu ile ilgili çeşitli geçici sınırlamalar bulunur.

HTTP Üstbilgisi değerleri sunucu uygulamaları tarafından kısıtlanmıştır. Http belirtimi başlık boyutunu kısıtlamaz.

Bir istek üstbilgisi alanı veya işlemek istediklerinden daha büyük bir alan kümesi alan bir sunucu, uygun bir 4xx (İstemci Hatası) durum koduyla yanıt vermelidir ZORUNLU. Bu tür başlık alanlarını göz ardı etmek, sunucunun kaçakçılık saldırıları talep etme hassasiyetini artıracaktır (Bölüm 9.5).

Çoğu sunucu 413 Entity Too Largebu olduğunda veya 4xx hatası döndürür .

Alan semantiği, bırakılan değer (ler) mesaj çerçevesini veya yanıt semantiğini değiştirmeden güvenli bir şekilde göz ardı edilebilecek şekildeyse, istemci, istemciden daha büyük alınan alınan başlık alanlarını atabilir veya kesebilir.

Sınırlandırılmamış HTTP üstbilgisi boyutu, sunucuyu saldırılara maruz bırakır ve organik trafik sunma kapasitesini düşürebilir.

Kaynak


2

İşte en popüler web sunucusunun sınırı

  • Apache - 8K
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Tomcat - 8K - 48K

1

Ayrıca, bazı durumlarda, çok sayıda başlık olması durumunda 502/400'ün nedeninin boyut bakımından çok sayıda başlıktan kaynaklanabileceğini buldum. dokümanlardan

tune.http.maxhdr Bir istekteki maksimum başlık sayısını ayarlar. Bir istek, bu değerden (ilk satır dahil) daha fazla sayıda başlıkla geldiğinde, "400 Hatalı İstek" durum kodu ile reddedilir. Benzer şekilde, çok büyük yanıtlar "502 Bozuk Ağ Geçidi" ile engellenir. Varsayılan değer 101'dir ve yaygın olarak kullanılan Apache sunucusunun aynı sınırı kullandığını düşünürsek tüm kullanımlar için yeterlidir. Bir buggy uygulamasının düzeltildiği zamana kadar geçici olarak çalışmasına izin vermek için bu sınırı daha ileriye taşımak yararlı olabilir. Her yeni başlığın her oturum için 32 bit bellek tükettiğini unutmayın, bu nedenle bu sınırı çok yükseğe itmeyin.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.