[Authorize] kullanılırken istek yapılandırılan maxQueryStringLength değerini aşıyor


122

görüntü açıklamasını buraya girin
C #'da bir MVC3 sitem var, JavaScript işlevinden sorgu parametreleri beslenen belirli bir görünüme sahibim, işlev siteye şu yolla yönlendiriyor:

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

sorgu_dizesi, JavaScript işlevi tarafından oluşturulan dinamik sorgu parametreleri dizesidir.

Bu tuhaflığın nedeni, bazen aynı işlevin, Reportviewer denetimini kullanmak zorunda olduğu için URL'yi bir ASP.Net web formuna geçirmesidir, alternatif eylem, bu durumda görünüme geçmesi durumunda bazı parametreleri kaydetmektir. (Bu mantıklı değilse daha fazla ayrıntı verebilir)

Eylem yöntemini [Yetkilendir] ile tanıştırana kadar her şey yolunda gidiyor. Yerindeyse kırılır, olmadan sorunsuz çalışır ve [Yetkilendir] diğer tüm yöntemlerde iyi çalışır.

Bu durumda URL'nin tamamı 966 karakter uzunluğundadır, araştırmadan sonra maxQueryStringLength değerinin varsayılan olarak 2048 olduğu, ancak tam sayı türünün herhangi bir değerine geçersiz kılınabileceği görülüyor , bu nedenle sadece sırıtma için

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

anahtarın altındaki web yapılandırma dosyasının anahtarı.

Orada neşe yok, bu yüzden gülünç oldum ve 4096 yaptım, hala neşe yok.

Şimdi, URL'nin tamamı 966 karakter uzunluğunda olduğu için, authorize özelliği başka bir 1082-3130 karakter ekleyemez, bu nedenle hatanın gerçekte ne olduğunu veya ayarın neden etkili olmadığını nasıl belirleyebilirim.

VS2010 Pro SP1


Lütfen aldığınız ayrıntılı hata mesajını ekleyin.
counsellorben

Yanıtlar:


70

Yetkisiz bir istek geldiğinde, isteğin tamamı URL olarak kodlanır ve yetkilendirme formundaki isteğe bir sorgu dizesi olarak eklenir, böylece sizin durumunuza göre bunun nerede bir soruna neden olabileceğini görebilirim.

MSDN'ye göre, web.config'deki maxQueryStringLength sıfırlamak için değiştirilecek doğru öğe, <httpRuntime>öğenin içindeki <system.web>öğedir, bkz. HttpRuntime Öğesi (ASP.NET Ayarları Şeması) . Bu öğeyi değiştirmeyi deneyin.


1
Ne yazık ki, doğru yere koymak işin püf noktası gibi görünüyor, yeterince zekayı karıştırmak, beni ilk olarak yayınladığım konumdaki aynı anahtara yönlendiriyor.
Sabre

8
Ayrıca bu paramın maksimum değerinin 2097151 olduğunu bilmekte fayda var - ilk başta Int32.MaxValue kullanmayı denedim, ancak çalışma zamanında atılan istisna, 0 ile 2097151 arasında bir değer kullanmamı sağladı.
TimDog


1
Bu parametrenin maksimum değerini 2097151 olarak ayarlayabilmenize rağmen, kabul edilen maksimum sorgu uzunluğunu etkileyen başka parametreler olduğuna inanıyorum. Kabul edilmeyen bu maksimumdan çok daha kısa bir sorgu dizgim vardı - 3.393 karakter uzunluğundaydı. 3.200 karakter uzunluğundaki başka bir sorgu iyi çalıştı.
markthewizard1234

@ markthewizard1234: Kabul: Ben Bu 4096 için 2048 den mayın artmıştır gelmiştir artık görünmüyor overlong sorgu dizesi için 404.something ile orijinal hata mesajı olarak, bazı etkisi vardı. Ancak şimdi, 400 kodlu başka bir hata mesajı döndürülüyor ve bu da çok uzun bir sorgu dizesini gösteriyor.
VEYA Eşleyici

213

web.configProjenizin kökünde , system.webdüğümün altında :

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

Ek olarak, bunu system.webServerdüğümün altına eklemek zorunda kaldım veya uzun sorgu dizelerim için bir güvenlik hatası aldım:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...

1
Bunu açmak ciddi bir güvenlik açığı yaratır mı? Maxurl ve maxquery'yi 2097151'e ayarlamak için hangi olumsuzluklar var?
Brian

1
Brian, bu güzel bir soru - Sorgu dizesine tarayıcı sınırının yanı sıra bir şekilde daha uzun bir şey koymak zararlı olmadığı sürece herhangi bir güvenlik açığı göremiyorum. Tarayıcı maksimum uzunluk sorgu dizeleri bu değere göre önceliklidir, cevabım olmayan başka bir soru. Yine de sorduğun için teşekkürler, belki buradaki biri buna daha fazla ışık tutabilir.
theJerm

Sanırım olası bir DOS güvenlik açığı vardır, ancak bu, isteği gerçekte nasıl ele aldığınıza bağlıdır. Bir istekte 100 kullanıcı eklemeye çalışırken bununla karşılaştım. Zaten olmasını istediğim bir şey değil.
Martin

4
MVC 4 projesinde aynı sorunu yaşadığım için bu, sorunumu hemen çözdü. Yukarıdakilerin her ikisini de eklemek hatamı çözdü. Çok teşekkür ederim!!
Ed DeGagne

3
Akıl maxQueryStringcinsinden uzunluğudur bayt 4294967295 bir maksimum değer ile uint gibi ve maxQueryStringLengthcinsinden uzunluğudur karakter int ancak 0-2097151 bir dizi.
marsze

5

Bu sorunla karşılaşabilecek ve yukarıdaki seçeneklerden hiçbiriyle çözülmeyen herkes için, bu benim için işe yarayan şeydi.

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

Bunu devre dışı bıraktım çünkü kendi Yetkimizi kullanıyorduk, ancak bu aynı soruna yol açıyor ve kabul edilen yanıt hiçbir şekilde yardımcı olmadı.


4

datatables.net kullanarak bu hatayı yaşıyorum

DataTable'ın () özelliklerinde varsayılan ajax Get to POST'u değiştirmeyi düzelttim

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },

Ben de veri tablolarını kullanıyordum ve yukarıdaki önerileri başarısız bir şekilde denedikten sonra, bu numara yaptı.
AidaM
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.