Delen via


CA2234: System.Uri-objecten doorgeven in plaats van tekenreeksen

Eigenschappen Weergegeven als
Regel-id CA2234
Titel System.Uri-objecten doorgeven in plaats van tekenreeksen
Categorie Gebruik
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Nee

Oorzaak

Er wordt een aanroep uitgevoerd naar een methode met een tekenreeksparameter waarvan de naam 'uri', 'Uri', 'urn', 'Urn', 'URL' of 'URL' bevat en het declareertype van de methode een bijbehorende overbelasting van de methode bevat die een System.Uri parameter bevat.

Deze regel kijkt standaard alleen naar extern zichtbare methoden en typen, maar dit is configureerbaar.

Beschrijving van regel

Een parameternaam wordt gesplitst in tokens op basis van de kameelbehuizingconventie en vervolgens wordt elk token gecontroleerd om te zien of het gelijk is aan 'URI', 'URI', 'urn', 'Urn', 'URL' of 'URL'. Als er een overeenkomst is, wordt ervan uitgegaan dat de parameter een URI (Uniform Resource Identifier) vertegenwoordigt. Een tekenreeksweergave van een URI is gevoelig voor parserings- en coderingsfouten en kan leiden tot beveiligingsproblemen. De Uri klasse biedt deze services op een veilige en veilige manier. Wanneer er een keuze is tussen twee overbelastingen die alleen verschillen met betrekking tot de weergave van een URI, moet de gebruiker de overbelasting kiezen die een Uri argument gebruikt.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, roept u de overbelasting aan die het Uri argument gebruikt.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken als de tekenreeksparameter geen URI vertegenwoordigt.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Code configureren om te analyseren

Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.

U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (gebruik) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Specifieke API-oppervlakken opnemen

U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Voorbeeld

In het volgende voorbeeld ziet u een methode, ErrorPronedie de regel en een methode schendt, SaferWaywaarmee de Uri overbelasting correct wordt aangeroepen:

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) { }
    }
}