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 プロパティを文字列にすることはできません