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 오버로드를 호출합니다.