CA3004: Examinar código quanto a vulnerabilidades de divulgação de informações
Property | Valor |
---|---|
ID da regra | CA3004 |
Título | Examinar código quanto a vulnerabilidades de divulgação de informações |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
A mensagem de uma exceção, rastreamento de pilha ou representação de string atinge a saída da web.
Por padrão, essa regra analisa toda a base de código, mas isso é configurável.
Descrição da regra
A divulgação de informações de exceção fornece aos invasores insights sobre a parte interna do aplicativo, o que pode ajudá-los a encontrar outras vulnerabilidades a serem exploradas.
Essa regra tenta localizar uma mensagem de exceção, rastreamento de pilha ou representação de string sendo enviada para uma resposta HTTP.
Observação
Essa regra não é capaz de rastrear dados em assemblies. Por exemplo, se um assembly captura uma exceção e a passa para outro assembly que gera a exceção, essa regra não produzirá um aviso.
Observação
Há um limite configurável para a profundidade com que essa regra analisa o fluxo de dados nas chamadas de método. Para obter informações sobre como configurar o limite em um arquivo EditorConfig, consulte Configuração do analisador.
Como corrigir violações
Não envie informações de exceção para respostas HTTP. Em vez disso, forneça uma mensagem de erro genérica. Para obter mais informações, consulte a página de tratamento inadequado de erros do OWASP.
Quando suprimir avisos
Se você souber que sua saída da Web está dentro do limite de confiança do seu aplicativo e nunca foi exposta fora, não há problema em suprimir esse aviso. Isso é incomum. Leve em consideração que o limite de confiança do seu aplicativo e os fluxos de dados podem mudar ao longo do tempo.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA3004
// The code that's violating the rule is on this line.
#pragma warning restore CA3004
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA3004.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Configurar código para analisar
Use as opções a seguir para configurar em quais partes da base de código essa regra deve ser executada.
Você pode configurar essas opções apenas para essa regra, para todas as regras às quais ela se aplica ou para todas as regras nessa categoria (Segurança) às quais ela se aplica. Para saber mais, confira Opções de configuração de regra de qualidade de código.
Excluir símbolos específicos
Você pode excluir da análise símbolos específicos, como tipos e métodos. Por exemplo, para especificar que a regra não deve ser executada em nenhum código dentro de tipos nomeados MyType
, adicione o seguinte par chave-valor a um arquivo .editorconfig no seu projeto:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Formatos de nome de símbolo permitidos no valor da opção (separados por |
):
- Somente nome do símbolo (inclui todos os símbolos com o nome, independentemente do tipo ou namespace que contém).
- Nomes totalmente qualificados no formato de ID de documentação do símbolo. Cada nome de símbolo requer um prefixo do tipo símbolo, como
M:
para métodos,T:
para tipos eN:
para namespaces. .ctor
para construtores e.cctor
para construtores estáticos.
Exemplos:
Valor de Opção | Resumo |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Corresponde a todos os símbolos nomeados MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Corresponde a todos os símbolos nomeados MyType1 ou MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Corresponde ao método MyMethod específico com a assinatura totalmente qualificada especificada. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Corresponde aos métodos MyMethod1 e MyMethod2 específico com as assinaturas respectivas totalmente qualificadas. |
Excluir tipos específicos e seus tipos derivados
Você pode excluir tipos específicos e seus tipos derivados da análise. Por exemplo, para especificar que a regra não deve ser executada em nenhum método dentro de tipos nomeados MyType
e seus tipos derivados, adicione o seguinte par chave-valor a um arquivo .editorconfig no seu projeto:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Formatos de nome de símbolo permitidos no valor da opção (separados por |
):
- Somente nome do tipo (inclui todos os tipos com o nome, independentemente do tipo ou namespace que contém).
- Nomes totalmente qualificados no formato de ID de documentação do símbolo, com um prefixo opcional
T:
.
Exemplos:
Valor de Opção | Resumo |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Corresponde a todos os tipos nomeados MyType e todos os seus tipos derivados. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Corresponde a todos os tipos nomeados MyType1 ou MyType2 e todos os seus tipos derivados. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Corresponde a um tipo MyType específico com determinado nome totalmente qualificado e todos os seus tipos derivados. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Corresponde a tipos MyType1 e MyType2 específicos com os respectivos nomes totalmente qualificados e todos os seus tipos derivados. |
Exemplos de pseudocódigo
Violação
using System;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs eventArgs)
{
try
{
object o = null;
o.ToString();
}
catch (Exception e)
{
this.Response.Write(e.ToString());
}
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
Try
Dim o As Object = Nothing
o.ToString()
Catch e As Exception
Me.Response.Write(e.ToString())
End Try
End Sub
End Class
Solução
using System;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs eventArgs)
{
try
{
object o = null;
o.ToString();
}
catch (Exception e)
{
this.Response.Write("An error occurred. Please try again later.");
}
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
Try
Dim o As Object = Nothing
o.ToString()
Catch e As Exception
Me.Response.Write("An error occurred. Please try again later.")
End Try
End Sub
End Class