Eine ASP.NET-Anforderung, die viele Formularschlüssel, Dateien oder Mitglieder der JSON-Nutzlast hat, schlägt mit einer Ausnahme fehl

Zusammenfassung

Das Microsoft-Sicherheitsupdate MS11-100 begrenzt die Höchstanzahl der Formularschlüssel, Dateien und JSON-Mitglieder in einer HTTP-Anforderung auf 1.000. Diese Änderung wird ASP.NET-Anwendungen Zurückweisungsanforderungen, die mehr als 1.000 dieser Elemente aufweisen. HTTP-Clients mit derartigen Anforderungen werden abgelehnt, und im Webbrowser wird eine Fehlermeldung angezeigt. Die Fehlermeldung hat in der Regel einen HTTP 500-Statuscode. Diese neue Grenze kann auf pro Anwendung konfiguriert werden. Anleitungen zur Konfiguration finden Sie in Abschnitt "Auflösung".


Problembeschreibung

ASP.NET-Anforderungen, die viele Formularschlüssel, Dateien oder eine hohe JSON-Nutzlast haben, empfangen eine Fehlerantwort vom Server. Das Anwendungsprotokoll auf dem Server enthält einen Warnungseintrag mit einer Quelle, bei der es sich um eine spezifische Version von ASP.NET handelt, und die Ereignis-ID "1309". Das Ereignisprotokoll enthält eine der folgenden Meldungen: 


Meldung 1:
Informationen zur Anwendung:
Anwendungsdomäne: /LM/W3SVC/1/ROOT/<App-Domäne>
Vertrauensstufe: Mittel
Virtueller Anwendungspfad: <VDIR-Pfad>
Anwendungspfad: <App-Pfad>
Computername: <Computername>
Prozessinformationen:
Prozess-ID: 0001
Prozessname: w3wp.exe
Kontoname: IIS-APPPOOL\DefaultAppPool

Ausnahmeinformationen:
Ausnahmetyp: HttpException
Ausnahmemeldung: Ungültige URL-codierte Formulardaten.
Bei System.Web.HttpRequest.FillInFormCollection()
Bei System.Web.HttpRequest.get_Form()
Bei System.Web.HttpRequest.get_HasForm()
Bei System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
Bei System.Web.UI.Page.DeterminePostBackMode()
Bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 


Meldung 2:
Informationen zur Anwendung:
Anwendungsdomäne: /LM/W3SVC/1/ROOT/<App-Domäne>
Vertrauensstufe: Mittel
Virtueller Anwendungspfad: <VDIR-Pfad>
Anwendungspfad: <App-Pfad>
Computername: <Computername>

Prozessinformationen:
Prozess-ID: 0001
Prozessname: w3wp.exe
Kontoname: IIS-APPPOOL\DefaultAppPool

Ausnahmeinformationen:
Ausnahmetyp: InvalidOperationException
Ausnahmemeldung: Der Vorgang ist aufgrund des aktuellen Zustands des Objekts ungültig.
Bei System.Web.HttpRequest.FillInFilesCollection()
Bei System.Web.HttpRequest.get_Files()
Bei FileUpload.Page_Load(Object sender, EventArgs e)
Bei System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
Bei System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
Bei System.Web.UI.Control.OnLoad(EventArgs e)
Bei System.Web.UI.Control.LoadRecursive()
Bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint

Meldung 3:
Informationen zur Anwendung:
Anwendungsdomäne: /LM/W3SVC/1/ROOT/<App-Domäne>
Vertrauensstufe: Mittel
Virtueller Anwendungspfad: <VDIR-Pfad>
Anwendungspfad: <App-Pfad>
Computername: <Computername>

Prozessinformationen:
Prozess-ID: 0001
Prozessname: w3wp.exe
Kontoname: IIS-APPPOOL\DefaultAppPool

Ausnahmeinformationen:
Ausnahmetyp: InvalidOperationException
Ausnahmemeldung: Der Vorgang ist aufgrund des aktuellen Zustands des Objekts ungültig.
Bei System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
Bei System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
Bei System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
Bei System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
Bei System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
Bei Failing.Page_Load(Object sender, EventArgs e)
Bei System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
Bei System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
Bei System.Web.UI.Control.OnLoad(EventArgs e)
Bei System.Web.UI.Control.LoadRecursive()
Bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 


Die IIS-Protokolldatei enthält einen Eintrag etwa folgenden Inhalts:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187




Ursache

Das Microsoft-Sicherheitsupdate, das im Sicherheitsbulletin MS11-100 beschrieben ist, ändert die standardmäßige Höchstanzahl der Formularschlüssel, Dateien und JSON-Mitglieder, die ASP.NET akzeptiert, in 1.000. Diese Änderung wurde vorgenommen, um das im Microsoft-Sicherheitsbulletin dokumentierte DoS-Sicherheitsrisiko (DoS = Denial of Service) zu adressieren.


Lösung

Anwendungen, die dieses Limit für Formularschlüssel oder Dateien errreichen, können die ASP.NET-AppSetting aspnet:MaxHttpCollectionKeys ändern, wie im Folgenden in einer Konfigurationsdatei einer ASP.NET-Anwendung dargestellt. Diese Einstellung befasst sich mit Fehlermeldung 1 und Fehlermeldung 2 im Abschnitt "Problembeschreibung".
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>


Hinweis Wenn Sie ASP.NET 1.1 auf einem x86-basierten System verwenden, wird die Einstellung durch Hinzufügen eines DWORD-Werts zum folgenden Registrierungsschlüssel angepasst:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
Wenn Sie ASP.NET 1.1 auf einem x64-basierten System verwenden, wird die Einstellung durch Hinzufügen eines DWORD-Werts zum folgenden Registrierungsschlüssel angepasst:

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



Anwendungen, die dieses Limit für JSON-Nutzlasten erreichen, können die ASP.NET-AppSetting aspnet:MaxJsonDeserializerMembers ändern, wie im Folgenden in einer Konfigurationsdatei einer ASP.NET-Anwendung dargestellt. Diese Einstellung befasst sich mit der Fehlermeldung 3 in Abschnitt "Problembeschreibung".
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>



Hinweis Durch Erhöhen dieses Werts über die Standardeinstellung wird die Anfälligkeit des Servers für DoS-Angriffe erhöht, die in Sicherheitsbulletin MS11-100 beschrieben ist.


Informationsquellen

Weitere Informationen zum Sicherheitsbulletin MS11-100 finden Sie im folgenden TechNet-Artikel: Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
2638420 MS11-100: Sicherheitsrisiko im .NET Framework kann eine Erhöhung von Berechtigungen ermöglichen: 29. Dezember 2011
Eigenschaften

Artikelnummer: 2661403 – Letzte Überarbeitung: 29.11.2012 – Revision: 1

Feedback