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

Переводы статьи Переводы статьи
Код статьи: 2661403 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Аннотация

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


Проблема

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


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

Сведения об исключении:
Тип исключения: HttpException
Сообщение об исключении: Данные формы, закодированные как URL-адрес, недействительны.
   в System.Web.HttpRequest.FillInFormCollection()
   в System.Web.HttpRequest.get_Form()
   в 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/<домен>
    Уровень доверия: Средний
    Виртуальный путь приложения: <виртуальный каталог>
    Путь приложения: <путь>
    Имя компьютера: <имя компьютера>

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

Сведения об исключении:
Тип исключения: InvalidOperationException
Сообщение об исключении: Операция недопустима для текущего состояния объекта.
   в System.Web.HttpRequest.FillInFilesCollection()
   в System.Web.HttpRequest.get_Files()
   в 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/<домен>
    Уровень доверия: Средний
    Виртуальный путь приложения: <виртуальный каталог>
    Путь приложения: <путь>
    Имя компьютера: <имя компьютера>

Сведения о процессе:
    ИД процесса: 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 serializer, String input, Type type, Int32 depthLimit)
   в System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
   в 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




Причина

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


Решение

В приложениях, где достигается это ограничение для ключей форм или файлов, можно изменить параметр ASP.NET aspnet:MaxHttpCollectionKeys, как показано в следующем примере файла конфигурации ASP.NET. Этот параметр позволяет устранить ошибку 1 и ошибку 2 в разделе "Проблема". 
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>


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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
Если вы используете ASP.NET 1.1 на компьютере под управлением 64-разрядной системы, этот параметр можно изменить, добавив значение DWORD в следующий раздел реестра:

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



В приложениях, где это ограничение достигается для членов JSON, можно изменить параметр ASP.NET aspnet:MaxJsonDeserializerMembers, как показано в следующем примере файла конфигурации ASP.NET. Этот параметр позволяет устранить ошибку 3 в разделе "Проблема".
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>



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


Ссылки

Для получения дополнительных сведений об информационном бюллетене безопасности ознакомьтесь со следующей статьей TechNet:
Бюллетень по безопасности Майкрософт MS11-100: важно.
Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2638420 MS11-100: уязвимость .NET Framework может привести к несанкционированному получению прав: 29 декабря 2011 г.

Свойства

Код статьи: 2661403 - Последний отзыв: 29 ноября 2012 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.5 Service Pack 1
  • Microsoft .NET Framework 3.5
  • Microsoft .NET Framework 2.0 Service Pack 2
  • Microsoft .NET Framework 2.0 Service Pack 1 (x86)
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.1 Service Pack 1
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0 Service Pack 3
  • Microsoft .NET Framework 1.0
  • Windows 7 Service Pack 1 на следующих платформах
    • Windows 7 Корпоративная
    • Windows 7 Профессиональная
    • Windows 7 Максимальная
    • Windows 7 Домашняя расширенная
    • Windows 7 Домашняя базовая
  • Windows 7 Корпоративная
  • Windows 7 Профессиональная
  • Windows 7 Максимальная
  • Windows 7 Домашняя расширенная
  • Windows 7 Домашняя базовая
  • 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 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 Web Server 2008
  • Service Pack 2 для Windows Vista на следующих платформах
    • 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 Server 2003, Standard Edition (32-bit x86)
    • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
    • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
    • Microsoft Windows Server 2003, Web Edition
    • Microsoft Windows Server 2003, Datacenter x64 Edition
    • Microsoft Windows Server 2003, Enterprise x64 Edition
    • Microsoft Windows Server 2003, Standard x64 Edition
    • Microsoft Windows XP Professional x64 Edition
    • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
    • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
  • Microsoft Windows XP Service Pack 3 на следующих платформах
    • Microsoft Windows XP Home Edition
    • Microsoft Windows XP Professional
Ключевые слова: 
atdownload kbbug kbexpertiseinter kbfix kbsecbulletin kbsecurity kbsecvulnerability KB2661403

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com