Share via


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) {}
      }
   };
}

相关规则

CA1057:字符串 URI 重载调用 System.Uri 重载

CA1056:URI 属性不应是字符串

CA1054:URI 参数不应为字符串

CA1055:URI 返回值不应是字符串