CA2234: Przekaż obiekty System.Uri zamiast ciągów
TypeName |
PassSystemUriObjectsInsteadOfStrings |
CheckId |
CA2234 |
Kategoria |
Microsoft.Usage |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Wystąpiło wywołanie do metody, która ma jako parametr ciąg, którego nazwa zawiera "uri", "Uri", "urn", "Urn", "url" lub "Url"; a deklarujący metodę typ zawiera odpowiadające przeciążenie metody, która ma parametr Uri.
Opis reguły
Nazwa parametru jest podzielona na podstawie konwencji CamelCase i sprawdzany jest każdy token, aby sprawdzić, czy jest równy "uri", "Uri", "urn", "Urn", "url" lub "Url".Jeżeli zostanie znaleziony zgodny, przyjmuje się że parametr reprezentuje jednolity identyfikator zasobów (URI).Reprezentacja ciągu identyfikatora URI jest podatna na analizowanie i kodowanie błędów i może prowadzić do powstawania luk w zabezpieczeniach.Klasa Uri dostarcza te usługi w bezpieczny sposób.Gdy istnieje wybór pomiędzy dwoma przeciążeniami, które różnią się tylko reprezentacją identyfikatora URI, użytkownik powinien wybrać przeciążenie, które pobiera argument Uri.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy wywołać przeciążenie, które pobiera argument Uri.
Kiedy pominąć ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli parametr ciągu nie reprezentuje identyfikatora URI.
Przykład
Poniższy przykład ilustruje metodę, ErrorProne, która narusza reguły i metody, SaferWay, która wywołuje poprawnie przeciążenie 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) {}
}
};
}
Powiązane reguły
CA1057: Przeciążenia identyfikatora URI, który jest ciągiem, wywołują przeciążenia System.Uri
CA1056: Właściwości identyfikatora URI nie powinny być ciągami
CA1054: Parametry identyfikatora URI nie powinny być ciągami
CA1055: Wartości zwracane identyfikatora URI nie powinny być ciągami