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