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


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

TypeName

StringUriOverloadsCallSystemUriOverloads

CheckId

CA1057

Категория

Microsoft.Design

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

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

Причина

В типе объявляются перегрузки метода, которые отличаются лишь тем, что в одной используется строковый параметр, а в другой — параметр System.Uri. Однако перегрузка, принимающая строковый параметр, не вызывает перегрузку, принимающую параметр Uri.

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

Поскольку перегрузки отличаются только использованием строкового параметра или параметра Uri, то предполагается, что строка представляет универсальный код ресурса (URI). В строковых представлениях кода URI часто встречаются ошибки синтаксического анализа и кодирования, которые могут привести к уязвимостям системы безопасности. Класс Uri предоставляет аналогичные службы более надежным и безопасным способом. Чтобы воспользоваться преимуществами класса Uri, перегрузка, принимающая строковый параметр, должна вызывать перегрузку Uri, используя строковый аргумент.

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

Повторно реализуйте метод, использующий строковое представление кода URI, таким образом, чтобы он создавал экземпляр класса Uri, используя строковый аргумент, а затем передавал объект Uri в перегрузку, которая принимает параметр Uri.

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

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

Пример

В следующем примере показана правильно реализованная строковая перегрузка.

Imports System

Namespace DesignLibrary

   Public Class History

      Sub AddToHistory(uriString As String)
          Dim newUri As New Uri(uriString)
          AddToHistory(newUri)
      End Sub

      Sub AddToHistory(uriType As Uri)
      End Sub

   End Class

End Namespace
using System;

namespace DesignLibrary
{
   public class History
   {
      public void AddToHistory(string uriString)
      {
          Uri newUri = new Uri(uriString);
          AddToHistory(newUri);
      }

      public void AddToHistory(Uri uriType) { }
   }
}
#using <system.dll>
using namespace System;

namespace DesignLibrary
{
   public ref class History
   {
   public:
      void AddToHistory(String^ uriString)
      {
          Uri^ newUri = gcnew Uri(uriString);
          AddToHistory(newUri);
      }

      void AddToHistory(Uri^ uriType) { }
   };
}

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

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

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

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

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