Recentemente Microsoft (12-29-2011) ha rilasciato un aggiornamento per risolvere diverse gravi vulnerabilità della sicurezza in .NET Framework. Una delle correzioni introdotte da MS11-100 mitiga temporaneamente un potenziale attacco DoS che coinvolge collisioni della tabella hash. Sembra che questa correzione rompe le pagine che contengono molti dati POST. Nel nostro caso, su pagine con elenchi di caselle di controllo molto grandi. Perché dovrebbe essere così?
Alcune fonti non ufficiali sembrano indicare che MS11-100 pone un limite di 500 articoli postback. Non riesco a trovare una fonte Microsoft che lo confermi. So che View State e altre funzionalità del framework assorbono parte di questo limite. C'è qualche impostazione di configurazione che controlla questo nuovo limite? Potremmo passare dall'uso delle caselle di controllo ma funziona piuttosto bene per la nostra situazione particolare. Vorremmo anche applicare la patch perché protegge da alcune altre cose brutte.
Fonte non ufficiale che discute il limite di 500:
Il bollettino risolve il vettore di attacco DOS fornendo un limite al numero di variabili che possono essere inviate per una singola richiesta POST HTTP. Il limite predefinito è 500, che dovrebbe essere sufficiente per le normali applicazioni Web, ma comunque abbastanza basso da neutralizzare l'attacco, come descritto dai ricercatori sulla sicurezza in Germania.
EDIT: codice sorgente con esempio di limite (che sembra essere 1.000, non 500) Creare un'app MVC standard e aggiungere il seguente codice alla vista indice principale:
@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>
}
Questo codice ha funzionato prima della patch. Non funziona dopo. L'errore è:
[InvalidOperationException: operazione non valida a causa dello stato corrente dell'oggetto.]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded () +82 System.Web.HttpValueCollection.FillFromEncodedBytes (Byte [] bytes, Encoding.Web + +1)
. HttpRequest.FillInFormCollection () +307