Firma Microsoft niedawno (12-29-2011) wydała aktualizację mającą na celu usunięcie kilku poważnych luk w zabezpieczeniach systemu .NET Framework. Jedna z poprawek wprowadzonych przez MS11-100 tymczasowo ogranicza potencjalny atak DoS obejmujący kolizje tabeli mieszającej. Wygląda na to, że ta poprawka rozbija strony zawierające dużo danych POST. W naszym przypadku na stronach, które mają bardzo duże listy pól wyboru. Dlaczego miałoby tak być?
Niektóre nieoficjalne źródła wydają się wskazywać, że MS11-100 nakłada limit 500 na przedmioty z późniejszym opóźnieniem. Nie mogę znaleźć źródła Microsoft, które to potwierdza. Wiem, że View State i inne funkcje ramowe pochłaniają część tego limitu. Czy jest jakieś ustawienie konfiguracji, które kontroluje ten nowy limit? Możemy zrezygnować z używania pól wyboru, ale działa to całkiem dobrze w naszej konkretnej sytuacji. Chcielibyśmy również zastosować łatkę, ponieważ chroni ona przed innymi nieprzyjemnymi rzeczami.
Nieoficjalne źródło omawiające limit 500:
Biuletyn naprawia wektor ataku DOS, określając limit liczby zmiennych, które można przesłać dla pojedynczego żądania HTTP POST. Domyślny limit to 500, co powinno wystarczyć na normalne aplikacje internetowe, ale wciąż wystarczająco niskie, aby zneutralizować atak, jak opisali badacze bezpieczeństwa w Niemczech.
EDYCJA: Kod źródłowy z przykładem limitu (który wydaje się być 1000, a nie 500) Utwórz standardową aplikację MVC i dodaj następujący kod do głównego widoku indeksu:
@using (Html.BeginForm())
{
<fieldset class="fields">
<p class="submit">
<input type="submit" value="Submit" />
</p>
@for (var i = 0; i < 1000; i++)
{
<div> @Html.CheckBox("cb" + i.ToString(), true) </div>
}
</fieldset>
}
Ten kod działał przed łatką. Po tym nie działa. Błąd jest następujący:
[InvalidOperationException: Operacja jest niepoprawna z powodu bieżącego stanu obiektu.]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded () +82 System.Web.HttpValueCollection.FillFromEncodedBytes (kodowanie bajtowe [1])
. HttpRequest.FillInFormCollection () +307