Недавно Microsoft (12-29-2011) выпустила обновление для устранения ряда серьезных уязвимостей безопасности в .NET Framework. Одно из исправлений, введенных MS11-100, временно смягчает потенциальную атаку DoS с участием столкновений с хэш-таблицами. Похоже, это исправление разбивает страницы, содержащие много данных POST. В нашем случае на страницах с очень большими списками флажков. Почему это так?
Некоторые неофициальные источники, по-видимому, указывают на то, что MS11-100 помещает лимит 500 на объекты обратной передачи. Я не могу найти источник Microsoft, который подтверждает это. Я знаю, что View State и другие функциональные возможности удовлетворяют некоторым из этих ограничений. Есть ли какой-либо параметр конфигурации, который контролирует этот новый предел? Мы могли бы отказаться от использования флажков, но это хорошо работает для нашей конкретной ситуации. Мы также хотели бы применить патч, потому что он защищает от других неприятных вещей.
Неофициальный источник, обсуждая ограничение 500:
Бюллетень фиксирует вектор атаки DOS, предоставляя ограничение на количество переменных, которые могут быть отправлены для одного HTTP POST запрос. Предел по умолчанию - 500, который должен быть достаточным для нормального веб-приложения, но все же достаточно низкие, чтобы нейтрализовать атаку как описанных исследователями безопасности в Германии.
EDIT: Исходный код с примером предела (который, как представляется, равен 1000, а не 500) Создайте стандартное приложение MVC и добавьте следующий код в основное представление индекса:
@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>
}
Этот код работал перед патчем. После этого он не работает. Ошибка:
[InvalidOperationException: операция недействительна из-за текущей состояние объекта.]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded() +82 System.Web.HttpValueCollection.FillFromEncodedBytes(байты [] байты, кодировка кодирования) +111
System.Web.HttpRequest.FillInFormCollection() +307