Share via


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

类型名

StringUriOverloadsCallSystemUriOverloads

CheckId

CA1057

类别

Microsoft.Design

是否重大更改

非重大更改

原因

某类型声明了仅在使用 System.Uri 参数替换字符串参数方面不同的方法重载,且采用字符串参数的重载不调用采用 Uri 参数的重载。

规则说明

由于各个重载仅字符串/Uri 参数不同,所以假设该字符串代表统一资源标识符 (URI)。 URI 的字符串表示形式容易导致分析和编码错误,并且可造成安全漏洞。 Uri 类以一种安全的方式提供这些服务。 要获得 Uri 类的好处,字符串重载应使用字符串参数调用 Uri 重载。

如何解决冲突

重新实现使用 URI 的字符串表示形式的方法,使其能够使用字符串变量创建 Uri 类的实例,然后将 Uri 对象传递给具有 Uri 参数的重载。

何时禁止显示警告

如果字符串参数不表示 URI,则可以安全地禁止显示此规则发出的警告。

示例

下面的示例演示一个正确实现的字符串重载。

Imports System

Namespace DesignLibrary

   Public Class History

      Sub AddToHistory(uriString As String)
          Dim newUri As New Uri(uriString)
          AddToHistory(newUri)
      End Sub

      Sub AddToHistory(uriType As Uri)
      End Sub

   End Class

End Namespace
using System;

namespace DesignLibrary
{
   public class History
   {
      public void AddToHistory(string uriString)
      {
          Uri newUri = new Uri(uriString);
          AddToHistory(newUri);
      }

      public void AddToHistory(Uri uriType) { }
   }
}
#using <system.dll>
using namespace System;

namespace DesignLibrary
{
   public ref class History
   {
   public:
      void AddToHistory(String^ uriString)
      {
          Uri^ newUri = gcnew Uri(uriString);
          AddToHistory(newUri);
      }

      void AddToHistory(Uri^ uriType) { }
   };
}

相关规则

CA2234:传递 System.Uri 对象,而不传递字符串

CA1056:URI 属性不应是字符串

CA1054:URI 参数不应为字符串

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