Berapa panjang maksimum yang mungkin dari string kueri?

559

Apakah ini tergantung pada browser? Juga, apakah tumpukan web yang berbeda memiliki batasan berbeda pada berapa banyak data yang bisa mereka dapatkan dari permintaan?

Brian Sullivan
sumber
Anda juga dapat memeriksa stackoverflow.com/questions/417142/…
Xinus
Ini hanya untuk mendapatkan permintaan! Ukuran maksimal dari permintaan POST (dengan atau tanpa multipart / formulir-data) di sini tidak diketahui!
peterh

Jawaban:

997

RFC 2616 (Protokol Transfer Hiperteks - HTTP / 1.1) menyatakan tidak ada batasan panjang string kueri (bagian 3.2.1). RFC 3986 (Uniform Resource Identifier - URI) juga menyatakan tidak ada batasan, tetapi menunjukkan nama host dibatasi hingga 255 karakter karena keterbatasan DNS (bagian 2.3.3).

Sementara spesifikasi tidak menentukan panjang maksimal, batas praktis ditentukan oleh browser web dan perangkat lunak server. Berdasarkan penelitian yang sayangnya tidak lagi tersedia di situs aslinya (itu mengarah ke situs pinjaman yang tampak teduh) tetapi masih dapat ditemukan di Internet Archive Of Boutell.com :

  • Microsoft Internet Explorer (Browser)
    Microsoft menyatakan bahwa panjang maksimum URL di Internet Explorer adalah 2.083 karakter, dengan tidak lebih dari 2.048 karakter di bagian jalur URL. Mencoba menggunakan URL lebih lama dari ini menghasilkan pesan kesalahan yang jelas di Internet Explorer.

  • Microsoft Edge (Browser)
    Batas tampaknya sekitar 81578 karakter. Lihat batasan Panjang URL dari Microsoft Edge

  • Chrome
    berhenti menampilkan URL setelah 64k karakter, tetapi dapat melayani lebih dari 100k karakter. Tidak ada pengujian lebih lanjut yang dilakukan selain itu.

  • Firefox (Browser)
    Setelah 65.536 karakter, bilah lokasi tidak lagi menampilkan URL di Windows Firefox 1.5.x. Namun, URL yang lebih lama akan berfungsi. Tidak ada pengujian lebih lanjut yang dilakukan setelah 100.000 karakter.

  • Safari (Browser)
    Setidaknya 80.000 karakter akan berfungsi. Pengujian tidak dicoba lebih dari itu.

  • Opera (Browser)
    Setidaknya 190.000 karakter akan berfungsi. Hentikan pengujian setelah 190.000 karakter. Opera 9 untuk Windows terus menampilkan URL yang sepenuhnya dapat diedit, disalin, dan ditempel di bilah lokasi bahkan pada 190.000 karakter.

  • Apache (Server)
    Awal mencoba untuk mengukur panjang URL maksimum di browser web bertemu dengan batas panjang URL server sekitar 4.000 karakter, setelah itu Apache menghasilkan kesalahan "413 Entity Too Large". Apache terkini yang ditemukan di Red Hat Enterprise Linux 4 saat ini digunakan. Dokumentasi resmi Apache hanya menyebutkan batas 8,192 byte pada bidang individual dalam permintaan.

  • Microsoft Internet Information Server (Server)
    Batas default adalah 16.384 karakter (ya, server web Microsoft menerima URL lebih panjang dari browser web Microsoft). Ini dapat dikonfigurasi.

  • Perl HTTP :: Daemon (Server)
    Hingga 8.000 byte akan berfungsi. Mereka membangun server aplikasi web dengan modul Perl :: HTTP Daemon akan menghadapi batas 16.384 byte pada ukuran gabungan dari semua header permintaan HTTP. Ini tidak termasuk data formulir metode POST, unggahan file, dll., Tetapi ia menyertakan URL. Dalam praktiknya ini menghasilkan kesalahan 413 ketika URL secara signifikan lebih panjang dari 8.000 karakter. Keterbatasan ini dapat dengan mudah dihilangkan. Cari semua kemunculan 16x1024 di Daemon.pm dan gantikan dengan nilai yang lebih besar. Tentu saja, ini meningkatkan ekspos terhadap serangan penolakan layanan.

Robert Cartaino
sumber
8
Mengapa Anda tidak mengatakan nomor versi juga daripada "Microsoft Internet Explorer (Browser)"?
LCJ
5
Tampaknya batas IIS default pada String Kueri secara signifikan kurang dari 16.384 karakter - dikutip sebagai 2048 di sini: iis.net/configreference/system.webserver/security/…
JTech
Saya pikir Anda membuat jenis dan keterbatasan DNS dibahas di bagian "3.2.2. Host" dari RFC3986, bukan 2.2.3. "Produsen URI harus menggunakan nama yang sesuai dengan sintaks DNS, bahkan ketika penggunaan DNS tidak segera terlihat, dan harus membatasi nama-nama ini tidak lebih dari 255 karakter."
Craig Hicks
Penyebab java.lang.IllegalArgumentException: Request header is too largepada server aplikasi boot tomcat spring.
Paramvir Singh Karwal
12

Meskipun secara resmi tidak ada batasan yang ditentukan oleh RFC 2616, banyak protokol keamanan dan rekomendasi menyatakan bahwa maxQueryStrings pada server harus ditetapkan ke batas karakter maksimum 1024. Sementara seluruh URL, termasuk querystring, harus ditetapkan ke maks 2048 karakter. Ini untuk mencegah kerentanan Permintaan HTTP Lambat DDOS di server web. Ini biasanya muncul sebagai kerentanan pada Qualys Web Application Scanner dan pemindai keamanan lainnya.

Silakan lihat contoh kode di bawah ini untuk Server Windows IIS dengan Web.config:

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

Ini juga akan berfungsi pada tingkat server menggunakan machine.config.

Catatan: Membatasi string kueri dan panjang URL mungkin tidak sepenuhnya mencegah Permintaan HTTP Lambat, serangan DDOS, tetapi merupakan salah satu langkah yang dapat Anda ambil untuk mencegahnya.

TroySteven
sumber
2
Dan sekarang saya punya alasan saya bisa memberi tahu para insinyur backend bahwa kami tidak akan menerima daftar seratus karakter 36 UUID dalam permintaanParams dari permintaan GET. Terima kasih!
Mordred
1

Tumpukan web yang berbeda mendukung panjang permintaan http yang berbeda. Saya tahu dari pengalaman bahwa tumpukan awal Safari hanya mendukung 4000 karakter dan karenanya mengalami kesulitan menangani halaman ASP.net karena USER-STATE. Ini bahkan untuk POST, jadi Anda harus memeriksa browser dan melihat apa batas stack. Saya pikir Anda dapat mencapai batas bahkan pada browser yang lebih baru. Saya tidak ingat tapi salah satunya (IE6, saya pikir) memiliki batas batas 16-bit, 32.768 atau sesuatu.

kdevine
sumber