CA2234: Passare oggetti System.Uri invece di stringhe
TypeName |
PassSystemUriObjectsInsteadOfStrings |
CheckId |
CA2234 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Viene effettuata una chiamata a un metodo che presenta un parametro di stringa il cui nome contiene "uri", "Uri", "urn", "Urn", "url" o "Url" e il tipo dichiarante del metodo contiene un overload di metodo corrispondente che presenta un parametro System.Uri.
Descrizione della regola
Un nome di parametro è suddiviso in token in base alla convenzione Camel, pertanto viene verificato se ogni token è uguale a "uri", "Uri", "urn", "Urn", "url" o "Url". Se è presente una corrispondenza, si presuppone che il parametro rappresenti un URI (Uniform Resource Identifier). Una rappresentazione in forma di stringa di un URI è soggetta a errori di analisi e codifica e può creare vulnerabilità nella sicurezza. La classe Uri fornisce questi servizi in un modo sicuro e protetto. Quando è presente una scelta tra due overload che differiscono esclusivamente nella rappresentazione di un URI, l'utente deve scegliere l'overload che utilizza un argomento Uri.
Come correggere le violazioni
Per correggere una violazione di questa regola, chiamare l'overload che utilizza l'argomento Uri.
Esclusione di avvisi
L'esclusione di un avviso da questa regola è sicura se il parametro di stringa non rappresenta un URI.
Esempio
Nell'esempio riportato di seguito vengono illustrati il metodo ErrorProne che viola la regola e il metodo SaferWay che chiama correttamente l'overload 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) {}
}
};
}
Regole correlate
CA1057: Gli overload URI dei valori di stringa chiamano gli overload System.Uri
CA1056: Le proprietà URI non devono essere stringhe