Um pedido ASP.NET que possua muitas chaves de formulários, ficheiros ou membros de payload JSON falha com uma excepção

Traduções de Artigos Traduções de Artigos
Artigo: 2661403 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

A actualização de segurança MS11-100 da Microsoft limita o número máximo de chaves de formulários, ficheiros e membros JSON para 1000 num pedido HTTP. Devido a esta alteração, as aplicações ASP.NET rejeitam os pedidos que possuam mais de 1000 destes elementos. Os clientes HTTP que efectuam estes tipos de pedidos serão negados e aparecerá uma mensagem de erro no browser. A mensagem de erro terá geralmente um código de estado HTTP 500. Este novo limite pode ser configurado numa base por aplicação. Consulte a secção "Resolução" para ver as instruções de configuração.


Sintomas

Os pedidos ASP.NET que possuam muitas chaves de formulários, ficheiros ou payloads JSON recebem uma resposta de erro do servidor. O registo da Aplicação no servidor possui uma entrada de Aviso com uma Origem que é uma versão específica do ASP.NET e uma ID do Evento de 1309. O registo do evento contém uma das mensagens seguintes:


Mensagem 1:
Informações da aplicação:
Domínio da aplicação: /LM/W3SVC/1/ROOT/<Domínio de Aplicação>
Nível de Fidedignidade: Média
Caminho Virtual da Aplicação: <Caminho VDIR>
Caminho da Aplicação: <Caminho da Aplicação>
Nome da máquina: <Nome da Máquina>
Informações do processo:
ID de processo: 0001
Nome do processo: w3wp.exe
Nome da conta: IIS APPPOOL\DefaultAppPool

Informações da excepção:
Tipo de excepção: HttpException
Mensagem de excepção: Os dados de formulário com codificação URL não são válidos.
em System.Web.HttpRequest.FillInFormCollection()
em System.Web.HttpRequest.get_Form()
em System.Web.HttpRequest.get_HasForm()
em System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
em System.Web.UI.Page.DeterminePostBackMode()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Mensagem 2:
Informações da aplicação:
Domínio da aplicação: /LM/W3SVC/1/ROOT/<Domínio de Aplicação>
Nível de Fidedignidade: Média
Caminho Virtual da Aplicação: <Caminho VDIR>
Caminho da Aplicação: <Caminho da Aplicação>
Nome da máquina: <Nome da Máquina>

Informações do processo:
ID de processo: 0001
Nome do processo: w3wp.exe
Nome da conta: IIS APPPOOL\DefaultAppPool

Informações da excepção:
Tipo de excepção: InvalidOperationException
Mensagem de excepção: A operação não é válida devido ao estado actual do objecto.
em System.Web.HttpRequest.FillInFilesCollection()
em System.Web.HttpRequest.get_Files()
em FileUpload.Page_Load(Object sender, EventArgs e)
em System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
em System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
em System.Web.UI.Control.OnLoad(EventArgs e)
em System.Web.UI.Control.LoadRecursive()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint

Mensagem 3:
Informações da aplicação:
Domínio da aplicação: /LM/W3SVC/1/ROOT/<Domínio de Aplicação>
Nível de Fidedignidade: Média
Caminho Virtual da Aplicação: <Caminho VDIR>
Caminho da Aplicação: <Caminho da Aplicação>
Nome da máquina: <Nome da Máquina>

Informações do processo:
ID de processo: 0001
Nome do processo: w3wp.exe
Nome da conta: IIS APPPOOL\DefaultAppPool

Informações da excepção:
Tipo de excepção: InvalidOperationException
Mensagem de excepção: A operação não é válida devido ao estado actual do objecto.
em System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
em System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
em System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
em System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
em System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
em Failing.Page_Load(Object sender, EventArgs e)
em System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
em System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
em System.Web.UI.Control.OnLoad(EventArgs e)
em System.Web.UI.Control.LoadRecursive()
em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


O ficheiro de registo dos IIS mostra uma entrada semelhante à que se segue:
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187




Causa

A actualização de segurança da Microsoft que o boletim de segurança MS11-100 corrige altera o número predefinido máximo de chaves de formulários, ficheiros e membros JSON que o ASP.NET irá aceitar num pedido para 1000. Esta alteração foi feita para corrigir a vulnerabilidade ao Denial of Service que o boletim de segurança MS11-100 da Microsoft refere.


Resolução

As aplicações que atingem este limite para chaves de formulários ou ficheiros podem modificar a appSetting do ASP.NET aspnet:MaxHttpCollectionKeys, conforme indicado abaixo num ficheiro de configuração de uma aplicação ASP.NET. Esta definição corrige a mensagem 1 de erro e a mensagem 2 de erro da secção "Sintomas".
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>


Nota Se estiver a utilizar o ASP.NET 1.1 num sistema baseado em x86, a definição é ajustada acrescentando um valor DWORD à seguinte chave de registo:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
Se estiver a utilizar o ASP.NET 1.1 num sistema baseado em x64, a definição é ajustada acrescentando um valor DWORD à seguinte chave de registo:

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



As aplicações que atingem este limite para payloads JSON podem modificar a appSetting do ASP.NET aspnet:MaxJsonDeserializerMembers, conforme indicado abaixo num ficheiro de configuração de uma aplicação ASP.NET. Esta definição corrige a mensagem 3 de erro da secção "Sintomas".
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>



Nota Aumentar este valor para acima da predefinição aumenta a susceptibilidade do seu servidor à vulnerabilidade ao Denial of Service, que é discutida no boletim de segurança MS11-100.


Referências

Para obter mais informações sobre o boletim de segurança MS11-100, consulte o seguinte artigo da TechNet:
Boletim de Segurança da Microsoft MS11-100 - Crítico
Para obter mais informações, clique no número de artigo seguinte para visualizar o artigo na Base de Dados de Conhecimento Microsoft:
2638420 MS11-100: Vulnerabilidade no .NET Framework pode permitir a elevação de privilégios: 29 de Dezembro de 2011

Propriedades

Artigo: 2661403 - Última revisão: 29 de novembro de 2012 - Revisão: 4.0
A informação contida neste artigo aplica-se a:
  • 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 nas seguintes plataformas
    • Windows 7 Enterprise
    • Windows 7 Professional
    • Windows 7 Ultimate
    • Windows 7 Home Premium
    • Windows 7 Home Basic
  • Windows 7 Enterprise
  • Windows 7 Professional
  • Windows 7 Ultimate
  • Windows 7 Home Premium
  • Windows 7 Home Basic
  • Windows Server 2008 R2 Service Pack 1 nas seguintes plataformas
    • 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 nas seguintes plataformas
    • Windows Server 2008 for Itanium-Based Systems
    • Windows Server 2008 Datacenter
    • Windows Server 2008 Enterprise
    • Windows Server 2008 Standard
    • Windows Web Server 2008
  • Windows Vista Service Pack 2 nas seguintes plataformas
    • 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 nas seguintes plataformas
    • Microsoft Windows Server 2003 Standard Edition
    • Microsoft Windows Server 2003 Enterprise Edition
    • Microsoft Windows Server 2003 Datacenter Edition
    • 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 nas seguintes plataformas
    • Microsoft Windows XP Home Edition
    • Microsoft Windows XP Professional Edition
Palavras-chave: 
atdownload kbbug kbexpertiseinter kbfix kbsecbulletin kbsecurity kbsecvulnerability KB2661403

Submeter comentários

 

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