Microsoft hat kürzlich (29.12.2011) ein Update veröffentlicht, um mehrere schwerwiegende Sicherheitslücken in .NET Framework zu beheben. Eine der von MS11-100 eingeführten Korrekturen verringert vorübergehend einen potenziellen DoS-Angriff mit Hash-Tabellenkollisionen. Es scheint, dass dieser Fix Seiten bricht, die viele POST-Daten enthalten. In unserem Fall auf Seiten mit sehr großen Kontrollkästchenlisten. Warum sollte das so sein?
Einige nicht offizielle Quellen scheinen darauf hinzuweisen, dass MS11-100 ein Limit von 500 für Postback-Artikel festlegt. Ich kann keine Microsoft-Quelle finden, die dies bestätigt. Ich weiß, dass View State und andere Framework-Funktionen einen Teil dieser Grenze verschlingen. Gibt es eine Konfigurationseinstellung, die dieses neue Limit steuert? Wir könnten von der Verwendung von Kontrollkästchen abweichen, aber es funktioniert ziemlich gut für unsere spezielle Situation. Wir möchten den Patch auch anwenden, da er vor anderen unangenehmen Dingen schützt.
Inoffizielle Quelle zur Erörterung der 500-Grenze:
Das Bulletin behebt den DOS-Angriffsvektor, indem es die Anzahl der Variablen begrenzt, die für eine einzelne HTTP-POST-Anforderung gesendet werden können. Das Standardlimit liegt bei 500, was für normale Webanwendungen ausreichen sollte, aber immer noch niedrig genug, um den von den Sicherheitsforschern in Deutschland beschriebenen Angriff zu neutralisieren.
BEARBEITEN: Quellcode mit Beispiel für ein Limit (das 1.000 zu sein scheint, nicht 500) Erstellen Sie eine Standard-MVC-App und fügen Sie der Hauptindexansicht den folgenden Code hinzu:
@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>
}
Dieser Code funktionierte vor dem Patch. Es funktioniert danach nicht mehr. Der Fehler ist:
[InvalidOperationException: Der Vorgang ist aufgrund des aktuellen Status des Objekts nicht gültig.]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded () +82 System.Web.HttpValueCollection.FillFromEncodedBytes (Byte [] encoding, Enc
. HttpRequest.FillInFormCollection () +307
Antworten:
Versuchen Sie, diese Einstellung in web.config hinzuzufügen. Ich habe dies gerade unter .NET 4.0 mit einem ASP.NET MVC 2-Projekt getestet und mit dieser Einstellung wirft Ihr Code nicht:
Das sollte jetzt funktionieren (nachdem Sie das Sicherheitsupdate angewendet haben), um das Limit zu ändern.
Ich hatte meinen Computer noch nicht aktualisiert, also habe ich mit Reflector die HttpValueCollection-Klasse überprüft und sie hatte nicht die folgende
ThrowIfMaxHttpCollectionKeysExceeded
Methode:Ich habe KB2656351 (Update für .NET 4.0) installiert , die Assemblys in Reflector neu geladen und die Methode wurde angezeigt :
Diese Methode ist also definitiv neu. Ich habe die Option Disassemble in Reflector verwendet und nach dem, was ich anhand des Codes erkennen kann, wird eine AppSetting überprüft:
Wenn der Wert in der Datei web.config nicht gefunden wird, wird er auf 1000 in
System.Web.Util.AppSettings.EnsureSettingsLoaded
(eine interne statische Klasse) festgelegt:Außerdem hat Alexey Gusarov vor zwei Tagen über diese Einstellung getwittert:
Und hier ist eine offizielle Antwort von einem Q & A mit Jonathan Ness (Sicherheitsentwicklungsmanager, MSRC) und Pete Voss (Senior Response Communications Manager, Trustworthy Computing):
quelle
Für diejenigen unter Ihnen, die noch .NET 1.1 verwenden, wird diese Einstellung nicht über web.config konfiguriert - es handelt sich um eine Registrierungseinstellung (ein Tipp für michielvoo, da ich dies nur über Reflector auf die gleiche Weise herausgefunden habe, wie er die Antwort gefunden hat). Das folgende Beispiel ist
MaxHttpCollectionKeys
in 32-Bit-Editionen von Windows auf 5000 festgelegt:Legen Sie für eine 64-Bit-Windows-Edition den Schlüssel unter dem Wow6432-Knoten fest:
quelle
Ich möchte hier nur meine $ 0,02 für Leute hinzufügen, die die Verrücktheit sehen.
Wenn Ihre Anwendung Seiteninformationen in ASP.NET ViewState speichert und den Schwellenwert für den Webserver überschreitet, tritt dieses Problem auf. Anstatt das Problem mit der Behebung von web.config sofort anzuwenden, sollten Sie zunächst einen Blick auf die Optimierung Ihres Codes werfen.
Zeigen Sie die Quelle an und suchen Sie nach mehr als 1000 versteckten Feldern im Ansichtsstatus. Sie haben Ihr Problem.
quelle
ThrowIfMaxHttpCollectionKeysExceeded()
wurde auch hinzugefügtSystem.Web.HttpCookieCollection
.Es sieht so aus, als würde
HttpCookieCollection.Get()
es angerufen, es ruft intern an und ruftHttpCookieCollection.AddCookie()
dann anThrowIfMaxHttpCollectionKeysExceeded()
.Was wir sehen, ist, dass die Website über einen Zeitraum von ein paar Stunden immer langsamer und fehlerhafter wird, bis sie anfängt, die zu werfen
InvalidOperationExcpetion
. Anschließend recyceln wir den App-Pool, wodurch das Problem noch einige Stunden behoben wird.quelle