permintaan melebihi maxQueryStringLength yang dikonfigurasi saat menggunakan [Otorisasi]

122

masukkan deskripsi gambar di sini
Saya memiliki situs MVC3 di C #, saya memiliki tampilan tertentu yang diberi makan parameter kueri dari fungsi JavaScript, fungsi tersebut dialihkan ke situs melalui

window.location.href = "../ActionName?" + query_string;

query_string menjadi string parameter kueri dinamis yang dibuat oleh fungsi JavaScript.

Alasan keanehan ini adalah bahwa terkadang fungsi yang sama meneruskan URL ke formulir web ASP.Net karena harus menggunakan kontrol reportviewer , tindakan alternatifnya adalah menyimpan beberapa parameter dalam hal ini ia lolos ke tampilan. (Bisa menjelaskan lebih banyak jika itu tidak masuk akal)

Semuanya berfungsi dengan baik sampai saya memperkenalkan [Otorisasi] ke metode tindakan. Henti jika ada di tempatnya, berfungsi dengan baik tanpa, dan [Otorisasi] berfungsi dengan baik di semua metode lainnya.

Seluruh URL dalam hal ini panjangnya 966 karakter, setelah penelitian tampaknya nilai maxQueryStringLength adalah 2048 secara default tetapi dapat diganti ke nilai jenis integer apa pun, jadi hanya untuk senyum saya menambahkan

<security>
  <requestFiltering>
    <requestLimits maxQueryString="2048"></requestLimits>
  </requestFiltering>
</security>

kunci ke file konfigurasi web di bawah kunci.

Tidak ada kegembiraan di sana, jadi saya menjadi konyol dan berhasil mencapai 4096, tetap tidak ada kegembiraan.

Sekarang dengan seluruh URL sepanjang 966 karakter, atribut authorize tidak dapat secara serius menambahkan 1082-3130 karakter lainnya, jadi bagaimana saya dapat menentukan apa kesalahan sebenarnya, atau mengapa pengaturan tidak berlaku.

VS2010 Pro SP1

Pedang
sumber
Tambahkan detail pesan kesalahan yang Anda terima.
counsellorben

Jawaban:

70

Saat permintaan tidak sah masuk, seluruh permintaan dienkode URL, dan ditambahkan sebagai string kueri ke permintaan ke formulir otorisasi, jadi saya dapat melihat di mana hal ini dapat mengakibatkan masalah mengingat situasi Anda.

Menurut MSDN, elemen yang benar untuk dimodifikasi untuk mereset maxQueryStringLength di web.config adalah <httpRuntime>elemen di dalam <system.web>elemen, lihat httpRuntime Element (ASP.NET Settings Schema) . Coba ubah elemen itu.

counsellorben
sumber
1
Sayangnya, meletakkannya di tempat yang benar tampaknya menjadi triknya, intellisense yang cukup menarik memandu saya ke kunci yang sama di lokasi tempat saya semula mempostingnya juga.
Saber
8
Yang juga perlu diketahui adalah nilai maksimum untuk parameter ini adalah 2097151 - pada awalnya saya mencoba menggunakan Int32.MaxValue, tetapi pengecualian yang dilemparkan saat runtime mengarahkan saya untuk menggunakan nilai antara 0 dan 2097151.
TimDog
tidak bekerja lihat ini. stackoverflow.com/questions/31624710/…
Jitendra Pancholi
1
Saya percaya bahwa meskipun Anda dapat menetapkan nilai maksimal untuk parameter ini ke 2097151, ada parameter lain yang memengaruhi panjang kueri maksimum yang diterima. Saya memiliki string kueri yang jauh lebih pendek dari maks ini yang tidak diterima - panjangnya 3.393 karakter. Kueri lain yang panjangnya 3.200 karakter berfungsi dengan baik.
markthewizard1234
@ markthewizard1234: Setuju: Saya telah meningkatkan milik saya dari 2048 menjadi 4096. Ini memiliki beberapa pengaruh, karena pesan kesalahan asli dengan 404. Sesuatu untuk string kueri yang terlalu panjang tidak muncul lagi. Tapi sekarang, pesan kesalahan lain dengan kode 400 dikembalikan, juga menunjukkan string kueri yang terlalu panjang.
ATAU Mapper
213

Di root web.configuntuk proyek Anda, di bawah system.webnode:

<system.web>
    <httpRuntime maxUrlLength="10999" maxQueryStringLength="2097151" />
...

Selain itu, saya harus menambahkan ini di bawah system.webServernode atau saya mendapat kesalahan keamanan untuk string kueri panjang saya:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...
theJerm
sumber
1
Apakah membuka ini menciptakan kelemahan keamanan yang serius? Apa negatifnya menyetel maxurl dan maxquery ke 2097151?
Brian
1
Brian, itu pertanyaan yang bagus - Saya tidak bisa melihat kelemahan keamanan kecuali meletakkan sesuatu yang lebih panjang pada string kueri selain batas browser bisa berbahaya. Apakah string kueri panjang maksimum browser lebih diutamakan daripada nilai ini adalah pertanyaan lain yang saya tidak punya jawabannya. Terima kasih telah bertanya, mungkin seseorang di sini bisa menjelaskan lebih banyak tentang ini.
theJerm
Saya kira ada potensi kerentanan DOS tetapi itu tergantung pada bagaimana Anda benar-benar menangani permintaan tersebut. Saya mengalami ini saat mencoba menambahkan 100 pengguna dalam satu permintaan. Bukan sesuatu yang saya ingin terjadi.
Martin
4
Ini segera menyelesaikan masalah saya, karena saya mengalami masalah yang sama pada proyek MVC 4. Menambahkan kedua hal di atas menyelesaikan kesalahan saya. Terima kasih banyak!!
Ed DeGagne
3
Pikiran yaitu maxQueryStringpanjang dalam byte sebagai uint dengan nilai maks 4294967295 dan maxQueryStringLengthpanjang dalam karakter sebagai int tetapi dengan kisaran 0-2097151.
marsze
5

Bagi orang lain yang mungkin mengalami masalah ini dan tidak diselesaikan dengan salah satu opsi di atas, inilah yang berhasil untuk saya.

1. Click on the website in IIS
2. Double Click on Authentication under IIS
3. Enable Anonymous Authentication

Saya telah menonaktifkan ini karena kami menggunakan Auth kami sendiri, tetapi itu mengarah ke masalah yang sama dan jawaban yang diterima tidak membantu sama sekali.

dball
sumber
4

saya mengalami kesalahan ini menggunakan datatables.net

saya memperbaiki mengubah ajax default Dapatkan ke POST di properti te dari DataTable ()

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },
elblogdelbeto
sumber
Saya juga menggunakan datatables, dan setelah gagal mencoba saran di atas, trik ini berhasil.
AidaM