次の方法で共有


CA2234: 文字列の代わりに System.Uri オブジェクトを渡します

TypeName

PassSystemUriObjectsInsteadOfStrings

CheckId

CA2234

分類

Microsoft.Usage

互換性に影響する変更点

なし

原因

"uri"、"Uri"、"urn"、"Urn"、"url"、または "Url" という名前を持つ文字列パラメーターが指定されたメソッドに対して、呼び出しが行われました。また、そのメソッドの型宣言に対応するメソッドのオーバーロードが存在し、Uri パラメーターが指定されています。

規則の説明

パラメーター名は、Camel 形式の大文字と小文字の表記規則に基づいて、トークンに分割されます。次に、各トークンは、"uri"、"Uri"、"urn"、"Urn"、"url"、または "Url" と一致するかどうかがチェックされます。一致する場合、パラメーターは URI (Uniform Resource Identifier) として扱われます。URI の文字列表現は解析エラーやエンコーディング エラーが発生しやすく、セキュリティ上の脆弱性の原因となる場合があります。Uri クラスを使用すると、安全な方法でこのサービスを実現できます。URI の表記方法のみが異なる 2 つのオーバーロードから選択する場合、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 戻り値を文字列にすることはできません