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 9 | 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
Opmerking
In het volgende voorbeeld ziet u een methode, ErrorProne
die de regel en een methode schendt, SaferWay
waarmee 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) { }
}
}