다음을 통해 공유


CA2234: 문자열 대신 System.Uri 개체를 전달하십시오.

TypeName

PassSystemUriObjectsInsteadOfStrings

CheckId

CA2234

범주

Microsoft.Usage

변경 수준

주요 변경 아님

원인

이름에 "uri", "Uri", "urn", "Urn", "url" 또는 "Url"이 포함된 문자열 매개 변수가 있는 메서드를 호출했으며 메서드의 선언 형식에 System.Uri 매개 변수가 있는 해당 메서드 오버로드가 포함되어 있습니다.

규칙 설명

매개 변수 이름은 카멜식 대/소문자 구분 규칙에 따라 토큰으로 분리되고 각 토큰은 "uri", "Uri", "urn", "Urn", "url" 또는 "Url"과 같은지 여부가 검사됩니다. 일치하는 항목이 있으면 매개 변수가 URI를 나타낸다고 가정합니다. URI의 문자열 표현은 구문 분석 및 인코딩 오류를 발생시키기 쉬우며 보안 문제를 일으킬 수 있습니다. Uri 클래스는 이러한 서비스를 안전한 방식으로 제공합니다. URI 표현만 다른 두 오버로드 중에서 하나를 선택해야 하는 경우 사용자는 Uri 인수를 사용하는 오버로드를 선택해야 합니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 Uri 인수를 사용하는 오버로드를 호출합니다.

경고를 표시하지 않는 경우

문자열 매개 변수가 URI를 나타내지 않을 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다.

예제

다음 예제에서는 이 규칙을 위반되는 ErrorProne 메서드와 Uri 오버로드를 올바르게 호출하는 SaferWay 메서드를 보여 줍니다.

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 반환 값은 문자열이면 안 됩니다.