Microsoft (12-29-2011) недавно выпустила обновление для устранения нескольких серьезных уязвимостей в .NET Framework. Одно из исправлений, введенных MS11-100 , временно смягчает потенциальную DoS-атаку, связанную с коллизиями хеш-таблиц. Похоже, это исправление разрывает страницы, которые содержат много данных POST. В нашем случае, на страницах, которые имеют очень большие списки флажков. Почему это так?
Некоторые неофициальные источники, кажется, указывают, что MS11-100 устанавливает ограничение в 500 для постбэков. Я не могу найти источник Microsoft, который подтверждает это. Я знаю, что View State и другие возможности фреймворка пожирают некоторые из этих ограничений. Есть ли какой-либо параметр конфигурации, который контролирует этот новый предел? Мы могли бы отказаться от использования флажков, но это работает довольно хорошо для нашей конкретной ситуации. Мы также хотели бы применить патч, потому что он защищает от некоторых других неприятных вещей.
Неофициальный источник, обсуждающий лимит 500:
Бюллетень исправляет вектор атаки DOS, предоставляя ограничение
количество переменных, которые могут быть отправлены для одного HTTP POST
запрос. Предел по умолчанию составляет 500, что должно быть достаточно для нормального
веб-приложения, но все еще достаточно низко, чтобы нейтрализовать атаку как
описан исследователями безопасности в Германии.
РЕДАКТИРОВАТЬ: Исходный код с примером лимита (который выглядит как 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 (Byte [] bytes, Encoding encoding) + 111
System.Web.HttpRequest.FillInFormCollection () + 307