CA2234: Předejte objekty System.Uri namísto řetězců
TypeName |
PassSystemUriObjectsInsteadOfStrings |
CheckId |
CA2234 |
Kategorie |
Microsoft.Usage |
Narušující změna |
Nenarušující |
Příčina
Dochází k volání metody u parametru, jehož název obsahuje "uri", "Uri", "urn", "Urn", "url" nebo"Url"; a deklarující typ metody obsahuje odpovídající přetížení metody, která obsahuje parametr Uri.
Popis pravidla
Název parametru je rozdělen do tokenů založených na způsobu CamelCase (psaní víceslovných názvů neoddělených mezerami) a poté je každý token zkontrolován, zda se nerovná "uri", "Uri", "urn", "Urn", "url" nebo "Url".Pokud nastane shoda, je parametr považován za představitele identifikátoru URI (uniform resource identifier).Řetězcová reprezentace identifikátoru URI je náchylná k chybám analýzy a kódování a může vést k ohrožení bezpečnosti.Třída Uri poskytuje tyto služby bezpečným a zabezpečeným způsobem.Při volbě mezi dvěma přetížení, která se liší pouze o reprezentací identifikátoru URI, měl by uživatel vybrat přetížení, které přebírá argument Uri.
Jak vyřešit porušení
Pro napravení porušení tohoto pravidla je zapotřebí zavolat přetížení, které přebírá argument Uri.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění tohoto pravidla, pokud řetězec parametru nepředstavuje identifikátor URI.
Příklad
Následující příklad ukazuje metodu, ErrorProne, která porušuje pravidlo a metodu, SaferWay, který správně volá přetížení Uri.
Imports System
Namespace DesignLibrary
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("https://www.adventure-works.com")
End Sub
Sub SaferWay()
Try
Dim newUri As New Uri("https://www.adventure-works.com")
uriHistory.AddToHistory(newUri)
Catch uriException As UriFormatException
End Try
End Sub
End Class
End Namespace
using System;
namespace DesignLibrary
{
class History
{
internal void AddToHistory(string uriString) {}
internal void AddToHistory(Uri uriType) {}
}
public class Browser
{
History uriHistory = new History();
public void ErrorProne()
{
uriHistory.AddToHistory("https://www.adventure-works.com");
}
public void SaferWay()
{
try
{
Uri newUri = new Uri("https://www.adventure-works.com");
uriHistory.AddToHistory(newUri);
}
catch(UriFormatException uriException) {}
}
}
}
#using <system.dll>
using namespace System;
namespace DesignLibrary
{
ref class History
{
public:
void AddToHistory(String^ uriString) {}
void AddToHistory(Uri^ uriType) {}
};
public ref class Browser
{
History^ uriHistory;
public:
Browser()
{
uriHistory = gcnew History();
}
void ErrorProne()
{
uriHistory->AddToHistory("https://www.adventure-works.com");
}
void SaferWay()
{
try
{
Uri^ newUri = gcnew Uri("https://www.adventure-works.com");
uriHistory->AddToHistory(newUri);
}
catch(UriFormatException^ uriException) {}
}
};
}
Související pravidla
CA1057: Řetězcové přetížení identifikátoru URI volá přetížení System.Uri
CA1056: Vlastnosti identifikátoru URI by neměly být řetězce
CA1054: Parametry identifikátoru URI by neměly být řetězce
CA1055: Návratové hodnoty identifikátoru URI by neměly být řetězce