Żądanie ASP.NET zawierające wiele kluczy formularzy, plików lub elementów ładunku JSON kończy się niepowodzeniem z powodu wyjątku

Numer ID artykułu: 2661403 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Streszczenie

Aktualizacja zabezpieczeń firmy Microsoft MS11-100 ogranicza maksymalną liczbę kluczy formularzy, plików i elementów JSON w żądaniu HTTP do 1000. Z powodu tej zmiany aplikacje ASP.NET odrzucają żądania zawierające więcej niż 1000 tych elementów. Tego rodzaju żądania wysyłane przez klienta HTTP zostają odrzucone, a w przeglądarce sieci Web pojawia się komunikat o błędzie. Komunikat o błędzie ma zwykle kod stanu HTTP 500. Ten nowy limit można skonfigurować dla poszczególnych aplikacji. Instrukcje dotyczące konfiguracji zawarto w sekcji „Rozwiązanie”.


Symptomy

Na żądania ASP.NET zawierające wiele kluczy formularzy, plików lub elementów JSON serwer odpowiada komunikatem o błędzie. W dzienniku aplikacji na serwerze znajduje się wpis ostrzeżenia, w którym jako Źródło wskazana jest konkretna wersja programu ASP.NET, a zdarzenie ma identyfikator 1309. Dziennik zdarzeń zawiera jeden z następujących komunikatów:


Komunikat 1:
Informacje o aplikacji:
Domena aplikacji: /LM/W3SVC/1/ROOT/<domena_aplikacji>
Poziom zaufania: Średni
Ścieżka wirtualna aplikacji: <ścieżka_VDIR>
Ścieżka aplikacji: <ścieżka_aplikacji>
Nazwa komputera: <nazwa_komputera>
Informacje o procesie:
Identyfikator procesu: 0001
Nazwa procesu: w3wp.exe
Nazwa konta: IIS APPPOOL\DefaultAppPool

Informacje o wyjątku:
Typ wyjątku: HttpException
Komunikat o wyjątku: Dane formularza kodowane za pomocą adresu URL są nieprawidłowe.
w System.Web.HttpRequest.FillInFormCollection()
w System.Web.HttpRequest.get_Form()
w System.Web.HttpRequest.get_HasForm()
w System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
w System.Web.UI.Page.DeterminePostBackMode()
w System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Komunikat 2:
Informacje o aplikacji:
Domena aplikacji: /LM/W3SVC/1/ROOT/<domena_aplikacji>
Poziom zaufania: Średni
Ścieżka wirtualna aplikacji: <ścieżka_VDIR>
Ścieżka aplikacji: <ścieżka_aplikacji>
Nazwa komputera: <nazwa_komputera>

Informacje o procesie:
Identyfikator procesu: 0001
Nazwa procesu: w3wp.exe
Nazwa konta: IIS APPPOOL\DefaultAppPool

Informacje o wyjątku:
Typ wyjątku: InvalidOperationException
Komunikat o wyjątku: Ze względu na bieżący stan obiektu operacja jest nieprawidłowa.
w System.Web.HttpRequest.FillInFilesCollection()
w System.Web.HttpRequest.get_Files()
w FileUpload.Page_Load(Object sender, EventArgs e)
w System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
w System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
w System.Web.UI.Control.OnLoad(EventArgs e)
w System.Web.UI.Control.LoadRecursive()
w System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint

Komunikat 3:
Informacje o aplikacji:
Domena aplikacji: /LM/W3SVC/1/ROOT/<domena_aplikacji>
Poziom zaufania: Średni
Ścieżka wirtualna aplikacji: <ścieżka_VDIR>
Ścieżka aplikacji: <ścieżka_aplikacji>
Nazwa komputera: <nazwa_komputera>

Informacje o procesie:
Identyfikator procesu: 0001
Nazwa procesu: w3wp.exe
Nazwa konta: IIS APPPOOL\DefaultAppPool

Informacje o wyjątku:
Typ wyjątku: InvalidOperationException
Komunikat o wyjątku: Ze względu na bieżący stan obiektu operacja jest nieprawidłowa.
w System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
w System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
w System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
w System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
w System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
w Failing.Page_Load(Object sender, EventArgs e)
w System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
w System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
w System.Web.UI.Control.OnLoad(EventArgs e)
w System.Web.UI.Control.LoadRecursive()
w System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 


W dzienniku programu IIS znajduje się wpis podobny do następującego:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187




Przyczyna

Aktualizacja zabezpieczeń firmy Microsoft opisana w biuletynie zabezpieczeń MS11-100 zmienia domyślną maksymalną liczbę kluczy formularzy, plików i elementów JSON akceptowaną w żądaniu przez program ASP.NET na 1000. Tę zmianę wprowadzono w celu wyeliminowania luki w zabezpieczeniach umożliwiającej atak typu „odmowa usługi” udokumentowanej w biuletynie zabezpieczeń firmy Microsoft MS11-100.


Rozwiązanie

W przypadku aplikacji, które osiągają ten limit dla kluczy formularzy lub plików, można zmodyfikować pozycję programu ASP.NET appSetting aspnet:MaxHttpCollectionKeys, jak pokazano poniżej, w pliku konfiguracji aplikacji ASP.NET. To ustawienie rozwiązuje problem z komunikatami o błędach 1 i 2 z sekcji „Symptomy”.
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>


Uwaga W razie używania wersji ASP.NET 1.1 w systemie opartym na procesorach x86 to ustawienie dopasowuje się, dodając wartość DWORD do następującego klucza rejestru:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
W razie używania wersji ASP.NET 1.1 w systemie opartym na procesorach x64 to ustawienie dopasowuje się, dodając wartość DWORD do następującego klucza rejestru:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys



W przypadku aplikacji, które osiągają ten limit dla ładunków JSON, można zmodyfikować pozycję programu ASP.NET appSetting aspnet:MaxJsonDeserializerMembers, jak pokazano poniżej, w pliku konfiguracji aplikacji ASP.NET. To ustawienie rozwiązuje problem z komunikatem o błędzie 3 z sekcji „Symptomy”.
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>



Uwaga Zwiększenie powyższej wartości ponad ustawienie domyślne zwiększa podatność serwera na zagrożenie atakiem typu „odmowa usługi” z wykorzystaniem luki w zabezpieczeniach omówionej w biuletynie zabezpieczeń MS11-100.


Materiały referencyjne

Aby uzyskać więcej informacji o biuletynie zabezpieczeń MS11-100, zobacz następujący artykuł w witrynie TechNet:
Biuletyn zabezpieczeń MS11-100 firmy Microsoft — krytyczne
Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2638420 MS11-100: Luka w zabezpieczeniach programu .NET Framework umożliwia podniesienie uprawnień: 29 grudnia 2011

Właściwości

Numer ID artykułu: 2661403 - Ostatnia weryfikacja: 29 listopada 2012 - Weryfikacja: 4.0
Informacje zawarte w tym artykule dotyczą:
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.5 Service Pack 1
  • Microsoft .NET Framework 3.5
  • Microsoft .NET Framework 2.0 Service Pack 2
  • Microsoft .NET Framework 2.0 Service Pack 1 (x86)
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.1 Service Pack 1
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0 Service Pack 3
  • Microsoft .NET Framework 1.0
  • Windows 7 Service Pack 1 na następujących platformach
    • Windows 7 Enterprise
    • Windows 7 Professional
    • Windows 7 Ultimate
    • Windows 7 Home Premium
    • Windows 7 Home Basic
  • Windows 7 Enterprise
  • Windows 7 Professional
  • Windows 7 Ultimate
  • Windows 7 Home Premium
  • Windows 7 Home Basic
  • Windows Server 2008 R2 Service Pack 1 na następujących platformach
    • Windows Server 2008 R2 Standard
    • Windows Server 2008 R2 Enterprise
    • Windows Server 2008 R2 Datacenter
  • Windows Server 2008 R2 Standard
  • Windows Server 2008 R2 Enterprise
  • Windows Server 2008 R2 Datacenter
  • Windows Server 2008 Service Pack 2 na następujących platformach
    • Windows Server 2008 for Itanium-Based Systems
    • Windows Server 2008 Datacenter
    • Windows Server 2008 Enterprise
    • Windows Server 2008 Standard
    • Windows Web Server 2008
  • Dodatek Service Pack 2 do systemu Windows Vista na następujących platformach
    • Windows Vista Business
    • Windows Vista Enterprise
    • Windows Vista Home Basic
    • Windows Vista Home Premium
    • Windows Vista Starter
    • Windows Vista Ultimate
    • Windows Vista Enterprise 64-bit edition
    • Windows Vista Home Basic 64-bit edition
    • Windows Vista Home Premium 64-bit edition
    • Windows Vista Ultimate 64-bit edition
    • Windows Vista Business 64-bit edition
  • Microsoft Windows Server 2003 Service Pack 2 na następujących platformach
    • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
    • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
    • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
    • Microsoft Windows Server 2003, Web Edition
    • Microsoft Windows Server 2003, Datacenter x64 Edition
    • Microsoft Windows Server 2003, Enterprise x64 Edition
    • Microsoft Windows Server 2003, Standard x64 Edition
    • Microsoft Windows XP Professional x64 Edition
    • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
    • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
  • Microsoft Windows XP Service Pack 3 na następujących platformach
    • Microsoft Windows XP Home Edition
    • Microsoft Windows XP Professional
Słowa kluczowe: 
atdownload kbbug kbexpertiseinter kbfix kbsecbulletin kbsecurity kbsecvulnerability KB2661403

Przekaż opinię