Condividi tramite


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

CA1054: I parametri URI non devono essere stringhe

CA1055: I valori restituiti URI non devono essere stringhe