Запрос ASP.NET с большим количеством ключей форм, файлов или полезных данных JSON завершается сбоем с исключением.

Применяется к
.NET Framework 3.5 Service Pack 1 Windows 7 Service Pack 1 Windows 7 Enterprise Windows 7 Professional Windows 7 Ultimate Windows 7 Home Premium Windows 7 Home Basic Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Standard Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Datacenter Windows Server 2008 Service Pack 2 Windows Server 2008 for Itanium-Based Systems Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 Web Edition Windows Vista Service Pack 2 Windows Vista Business Windows Vista Enterprise Windows Vista Home Basic Windows Vista Home Premium Windows Vista Starter Windows Vista Ultimate Windows Vista Enterprise 64-bit Edition Windows Vista Home Basic 64-bit Edition Windows Vista Home Premium 64-bit Edition Windows Vista Ultimate 64-bit Edition Windows Vista Business 64-bit Edition Microsoft Windows Server 2003 Service Pack 2 Microsoft Windows XP Professional x64 Edition Microsoft Windows XP Service Pack 3 Microsoft Windows XP Home Edition Microsoft Windows XP Professional

Сводка

Обновление безопасности Майкрософт MS11-100 ограничивает максимальное число ключей форм, файлов и членов JSON до 1000 в HTTP-запросе. Из-за этого изменения приложения ASP.NET отклоняют запросы, которые имеют более 1000 этих элементов. Http-клиенты, выполняющие такие запросы, будут отклонены, а в веб-браузере появится сообщение об ошибке. Сообщение об ошибке обычно содержит код состояния HTTP 500. Это новое ограничение можно настроить для каждого приложения. Инструкции по настройке см. в разделе "Разрешение".

Проблема

ASP.NET запросы с большим количеством ключей форм, файлов или полезных данных JSON получают от сервера ответ об ошибке. Журнал приложений на сервере содержит запись Предупреждение с источником, который является определенной версией ASP.NET, и идентификатором события 1309. Журнал событий содержит одно из следующих сообщений:

Сообщение 1:

Примечание

Сведения о приложении:
Домен приложения: /LM/W3SVC/1/ROOT/<App Domain>
Уровень доверия: средний
Виртуальный путь к приложению: <путь VDIR>
Путь к приложению: <путь к приложению>
Имя компьютера: <Имя компьютера>
Сведения о процессе:
Идентификатор процесса: 0001
Имя процесса: w3wp.exe
Имя учетной записи: IIS APPPOOL\DefaultAppPool

Сведения об исключении:
Тип исключения: HttpException
Сообщение об исключении. Недопустимые данные формы в кодировке URL-адреса.
в System.Web.HttpRequest.FillInFormCollection()
at System.Web.HttpRequest.get_Form()
at System.Web.HttpRequest.get_HasForm()
в System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
в System.Web.UI.Page.DeterminePostBackMode()
в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Сообщение 2:

Примечание

Сведения о приложении:
Домен приложения: /LM/W3SVC/1/ROOT/<App Domain>
Уровень доверия: средний
Виртуальный путь к приложению: <путь VDIR>
Путь к приложению: <путь к приложению>
Имя компьютера: <Имя компьютера>

Сведения о процессе:
Идентификатор процесса: 0001
Имя процесса: w3wp.exe
Имя учетной записи: IIS APPPOOL\DefaultAppPool

Сведения об исключении:
Тип исключения: InvalidOperationException
Сообщение об исключении. Операция недопустима из-за текущего состояния объекта.
в System.Web.HttpRequest.FillInFilesCollection()
at System.Web.HttpRequest.get_Files()
at FileUpload.Page_Load(Object sender, EventArgs e)
в System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
в System.Web.UI.Control.OnLoad(EventArgs e)
в System.Web.UI.Control.LoadRecursive()
в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint

Сообщение 3.

Примечание

Сведения о приложении:
Домен приложения: /LM/W3SVC/1/ROOT/<App Domain>
Уровень доверия: средний
Виртуальный путь к приложению: <путь VDIR>
Путь к приложению: <путь к приложению>
Имя компьютера: <Имя компьютера>

Сведения о процессе:
Идентификатор процесса: 0001
Имя процесса: w3wp.exe
Имя учетной записи: IIS APPPOOL\DefaultAppPool

Сведения об исключении:
Тип исключения: InvalidOperationException
Сообщение об исключении. Операция недопустима из-за текущего состояния объекта.
в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
в system.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(Сериализатор JavaScriptSerializer, String input, Type type, Int32 depthLimit)
в System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(Строковые входные данные)
at Failing.Page_Load(Object sender, EventArgs e)
в System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
в System.Web.UI.Control.OnLoad(EventArgs e)
в System.Web.UI.Control.LoadRecursive()
в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

        
В файле журнала IIS отображается запись, похожая на следующую:

2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187

Причина

Обновление системы безопасности Майкрософт, к которому относится бюллетень по безопасности MS11-100, изменяет максимальное число ключей форм, файлов и членов JSON, которые ASP.NET будут принимать в запросе, до 1000. Это изменение было внесено для устранения уязвимости типа "отказ в обслуживании", которая описана в бюллетене майкрософт по безопасности MS11-100.

Решение

Приложения, которые достигают этого ограничения для ключей форм или файлов, могут изменять ASP.NET appSetting aspnet:MaxHttpCollectionKeys, как показано ниже в файле конфигурации приложения ASP.NET. Этот параметр устраняет сообщения об ошибке 1 и 2 из раздела "Симптомы".

<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>

        
Примечание
Если вы используете ASP.NET 1.1 в системе на базе x86, параметр корректируется путем добавления значения DWORD в следующий раздел реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys

Если вы используете ASP.NET 1.1 в системе на базе x64, параметр корректируется путем добавления значения DWORD в следующий раздел реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys

        
        
Приложения, которые достигли этого ограничения для полезных данных JSON, могут изменять ASP.NET appSetting aspnet:MaxJsonDeserializerMembers, как показано ниже в файле конфигурации приложения ASP.NET. Этот параметр устраняет сообщение об ошибке 3 из раздела "Симптомы".

<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>

      

        
Примечание. Увеличение этого значения выше параметра по умолчанию повышает восприимчивость сервера к уязвимости типа "отказ в обслуживании", описанной в бюллетене по безопасности MS11-100.

Ссылки

Дополнительные сведения о бюллетене по безопасности MS11-100 см. в следующей статье TechNet:

Бюллетень по безопасности (Майкрософт) MS11-100 — критический Для получения дополнительных сведений щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

2638420 MS11-100: уязвимость в платформа .NET Framework может привести к повышению привилегий: 29 декабря 2011 г.