Поделиться через


CA2234: передавайте объекты System.Uri вместо строк

TypeName

PassSystemUriObjectsInsteadOfStrings

CheckId

CA2234

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Осуществлен вызов метода, имеющего строковый параметр, имя которого содержит "uri", "Uri", "urn", "Urn", "url" или "Url"; объявляющий тип метода содержит перегрузку соответствующего метода с параметром Uri.

Описание правила

Имя параметра разделено на маркеры на основании соглашения об использовании стиля Camel, И каждый маркер проверяется на соответствие "uri", "Uri", "urn", "Urn", "url" или "Url".В случае совпадения предполагается, что параметр представляет универсальный код ресурса (URI).В строковых представлениях кода URI часто встречаются ошибки синтаксического анализа и кодирования, которые могут привести к уязвимостям системы безопасности.Класс Uri предоставляет аналогичные службы более надежным и безопасным способом.Если существует возможность выбора между двумя перегрузками, отличающимися только представлением URI, отдать предпочтение следует перегрузке, принимающей аргумент Uri.

Устранение нарушений

Чтобы устранить нарушение данного правила, вызовите перегрузку, принимающую аргумент Uri.

Отключение предупреждений

Отключение предупреждений о нарушении данного правила безопасно в том случае, если строковый параметр не представляет код URI.

Пример

В следующем примере показан метод ErrorProne, приводящий к нарушению правила, и метод SaferWay, соответствующим образом вызывающий перегрузку 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) {}
      }
   };
}

Связанные правила

CA1057: перегрузки строковых параметров URI вызывают перегрузки System.Uri

CA1056: свойства URI не должны быть строками

CA1054: параметры URI не должны быть строками

CA1055: возвращаемые значения URI не должны быть строками