żądanie przekracza skonfigurowaną wartość maxQueryStringLength podczas korzystania z [Authorize]


122

wprowadź opis obrazu tutaj
Mam witrynę MVC3 w C #, mam określony widok, który jest podawany z parametrami zapytania z funkcji JavaScript, funkcja przekierowuje do witryny za pośrednictwem

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

query_string to ciąg dynamicznych parametrów zapytania utworzony przez funkcję JavaScript.

Przyczyną tej dziwności jest to, że czasami ta sama funkcja przekazuje adres URL do formularza internetowego ASP.Net, ponieważ musi używać kontrolki reportviewer , alternatywną akcją jest zapisanie niektórych parametrów w tym przypadku przekazuje je do widoku. (Może rozwinąć więcej, jeśli to nie ma sensu)

Całość działa dobrze, dopóki nie wprowadzę [Authorize] do metody akcji. Przerywa, jeśli jest na miejscu, działa dobrze bez, a [Autoryzuj] działa dobrze na wszystkich innych metodach.

Cały adres URL w tym przypadku ma długość 966 znaków, po badaniach wydaje się, że wartość maxQueryStringLength to domyślnie 2048, ale można ją zastąpić dowolną wartością typu integer, więc tylko dla uśmiechów dodałem

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

key do pliku konfiguracji sieciowej pod kluczem.

Żadnej radości, więc stałem się śmieszny i zrobiłem to 4096, nadal nie ma radości.

Teraz, gdy cały adres URL ma długość 966 znaków, atrybut autoryzacji nie może poważnie dodawać kolejnych 1082-3130 znaków, więc jak mogę określić, na czym właściwie polega błąd lub dlaczego ustawienie nie działa.

VS2010 Pro z dodatkiem SP1


Dodaj szczegółowy komunikat o błędzie, który otrzymujesz.
counsellorben

Odpowiedzi:


70

Gdy przychodzi nieautoryzowane żądanie, całe żądanie jest kodowane w adresie URL i dodawane jako ciąg zapytania do żądania w formularzu autoryzacji, dzięki czemu mogę zobaczyć, gdzie może to spowodować problem w Twojej sytuacji.

Według MSDN prawidłowym elementem do zmodyfikowania w celu zresetowania wartości maxQueryStringLength w pliku web.config jest <httpRuntime>element wewnątrz <system.web>elementu, zobacz element httpRuntime (schemat ustawień ASP.NET) . Spróbuj zmodyfikować ten element.


1
Niestety, umieszczenie go we właściwym miejscu wydaje się być sztuczką, a wystarczająco interesująca inteligencja prowadzi mnie do tego samego klucza w miejscu, w którym go pierwotnie umieściłem.
Sabre

8
Warto również wiedzieć, że maksymalna wartość tego parametru to 2097151 - na początku próbowałem użyć wartości Int32.MaxValue, ale wyjątek, który został zgłoszony w czasie wykonywania, wskazał mi, żebym użył wartości między 0 a 2097151.
TimDog


1
Uważam, że chociaż można ustawić maksymalną wartość tego parametru na 2097151, istnieją inne parametry, które wpływają na maksymalną akceptowaną długość zapytania. Miałem ciąg zapytania znacznie krótszy niż to maksimum, który nie został zaakceptowany - miał długość 3 393 znaków. Inne zapytanie, które miało długość 3200 znaków, działało dobrze.
markthewizard1234

@ markthewizard1234: Zgoda: zwiększyłem mój z 2048 do 4096. Ma to pewien wpływ, ponieważ pierwotny komunikat o błędzie z 404. coś dla zbyt długiego ciągu zapytania już się nie pojawia. Ale teraz zwracany jest inny komunikat o błędzie z kodem 400, również wskazujący na zbyt długi ciąg zapytania.
LUB Mapper

213

W katalogu głównym web.configprojektu, pod system.webwęzłem:

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

Ponadto musiałem dodać to pod system.webServerwęzłem lub otrzymałem błąd bezpieczeństwa dla moich długich ciągów zapytań:

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

1
Czy otwarcie tego powoduje jakieś poważne luki w zabezpieczeniach? Jakie są negatywy ustawiania maxurl i maxquery na 2097151?
Brian,

1
Brian, to dobre pytanie - nie widzę żadnych błędów bezpieczeństwa, chyba że w jakiś sposób umieszczenie czegoś dłuższego w ciągu zapytania poza limitem przeglądarki może być szkodliwe. Czy ciągi zapytań o maksymalnej długości przeglądarki mają pierwszeństwo przed tą wartością, to kolejne pytanie, na które nie mam odpowiedzi. Dzięki, że pytasz, może ktoś tutaj może rzucić więcej światła na ten temat.
Jerm,

Wydaje mi się, że istnieje potencjalna luka w zabezpieczeniach DOS, ale to zależy od tego, jak faktycznie obsłużysz żądanie. Wpadłem na to, próbując dodać 100 użytkowników w jednym żądaniu. I tak nie jest to coś, co chcę.
Martin

4
To natychmiast rozwiązało mój problem, ponieważ miałem ten sam problem w projekcie MVC 4. Dodanie obu powyższych rozwiązało mój błąd. Dziękuję bardzo!!
Ed DeGagne

3
Umysł, który maxQueryStringjest długością w bajtach jako uint z maksymalną wartością 4294967295 i maxQueryStringLengthjest długością w znakach, jak int, ale z zakresem 0-2097151.
marsze

5

Dla każdego, kto może napotkać ten problem i nie można go rozwiązać żadną z powyższych opcji, to zadziałało.

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

Wyłączyłem to, ponieważ używaliśmy własnego Auth, ale to prowadziło do tego samego problemu, a zaakceptowana odpowiedź w żaden sposób nie pomogła.


4

Mam ten błąd przy użyciu datatables.net

naprawiłem zmianę domyślnego ajax Get to POST we właściwościach DataTable ()

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

Używałem również danych i po bezskutecznym wypróbowaniu powyższych sugestii ta sztuczka zadziałała.
AidaM
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.