Заявка за 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

Резюме

Актуализацията на защитата на Microsoft 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()
в System.Web.HttpRequest.get_Form()
в System.Web.HttpRequest.get_HasForm()
at 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()
в System.Web.HttpRequest.get_Files()
в FileUpload.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at 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)
в 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(String input)
в Failing.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at 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. Тази промяна е направена за справяне с уязвимостта за отказ на услуга, която бюлетина на Microsoft за сигурността 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:

Бюлетин на Microsoft за сигурността MS11-100 – Критичен За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

2638420 MS11-100: Уязвимост в .NET Framework (платформа) може да позволи повишаване на привилегиите: 29 декември 2011 г.