CA2234:传递 System.Uri 对象,而不传递字符串
类型名 |
PassSystemUriObjectsInsteadOfStrings |
CheckId |
CA2234 |
类别 |
Microsoft.Usage |
是否重大更改 |
否 |
原因
进行了一次方法调用,调用的方法带有一个字符串参数,该参数的名称中包含“uri”、“Uri”、“urn”、“Urn”、“url”或“Url”;并且该方法的声明类型包含一个带有 System.Uri 参数的对应方法重载。
规则说明
参数名根据 Camel 大小写约定分为多个标记,随后对各个标记进行检查以查看其是否等于“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) {}
}
};
}