Partilhar via


CA2234: Passar objetos System.Uri em vez de cadeias de caracteres

Property valor
ID da regra CA2234
Título Passar objetos System.Uri em vez de cadeias de caracteres
Categoria Utilização
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Não

Motivo

Uma chamada é feita para um método que tem um parâmetro string cujo nome contém "uri", "Uri", "urn", "Urn", "url" ou "Url" e o tipo de declaração do método contém uma sobrecarga de método correspondente que tem um System.Uri parâmetro.

Por padrão, essa regra examina apenas métodos e tipos visíveis externamente, mas isso é configurável.

Descrição da regra

Um nome de parâmetro é dividido em tokens com base na convenção camel casing e, em seguida, cada token é verificado para ver se é igual a "uri", "Uri", "urn", "Urn", "url" ou "Url". Se houver uma correspondência, presume-se que o parâmetro representa um identificador de recurso uniforme (URI). Uma representação de cadeia de caracteres de um URI é propensa a erros de análise e codificação e pode levar a vulnerabilidades de segurança. A Uri classe presta estes serviços de forma segura. Quando há uma escolha entre duas sobrecargas que diferem apenas em relação à representação de um URI, o usuário deve escolher a sobrecarga que leva um Uri argumento.

Como corrigir violações

Para corrigir uma violação dessa regra, chame a sobrecarga que leva o Uri argumento.

Quando suprimir avisos

É seguro suprimir um aviso dessa regra se o parâmetro string não representar um URI.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

#pragma warning disable CA2234
// The code that's violating the rule is on this line.
#pragma warning restore CA2234

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA2234.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Configurar código para análise

Use a opção a seguir para configurar em quais partes da sua base de código executar essa regra.

Você pode configurar essa opção apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Uso) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.

Incluir superfícies de API específicas

Você pode configurar em quais partes da sua base de código executar essa regra, com base em sua acessibilidade. Por exemplo, para especificar que a regra deve ser executada somente na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Exemplo

O exemplo a seguir mostra um método, ErrorProne, que viola a regra e um método, SaferWay, que chama corretamente a Uri sobrecarga:

Imports System

Namespace ca2234

    Class History

        Friend Sub AddToHistory(uriString As String)
        End Sub

        Friend Sub AddToHistory(uriType As Uri)
        End Sub

    End Class

    Public Class Browser

        Dim uriHistory As New History()

        Sub ErrorProne()
            uriHistory.AddToHistory("http://www.adventure-works.com")
        End Sub

        Sub SaferWay()
            Try
                Dim newUri As New Uri("http://www.adventure-works.com")
                uriHistory.AddToHistory(newUri)
            Catch uriException As UriFormatException
            End Try
        End Sub

    End Class

End Namespace
class History
{
    internal void AddToHistory(string uriString) { }
    internal void AddToHistory(Uri uriType) { }
}

public class Browser
{
    History uriHistory = new History();

    public void ErrorProne()
    {
        uriHistory.AddToHistory("http://www.adventure-works.com");
    }

    public void SaferWay()
    {
        try
        {
            Uri newUri = new Uri("http://www.adventure-works.com");
            uriHistory.AddToHistory(newUri);
        }
        catch (UriFormatException) { }
    }
}