SYSLIB0001:UTF-7 编码不安全

UTF-7 编码在应用程序中不再广泛使用,并且许多规范现在在交换中禁止其使用。 它偶尔还会在不期望遇到 UTF-7 编码数据的应用程序中用作攻击途径。 Microsoft 警告不要使用 System.Text.UTF7Encoding,因为它不提供错误检测。

因此从 .NET 5 开始,以下 API 标记为已过时。 使用这些 API 会在编译时生成警告 SYSLIB0001

工作区

  • 如果在你自己的协议或文件格式中使用的是 Encoding.UTF7UTF7Encoding

    切换到使用 Encoding.UTF8UTF8Encoding。 UTF-8 是一种行业标准,并且受到语言、操作系统和运行时的广泛支持。 使用 UTF-8 简化了代码的将来维护,并使其与生态系统的其余部分更具互操作性。

  • 如果要将 Encoding 实例与 Encoding.UTF7 进行比较:

    可转为考虑针对众所周知的 UTF-7 代码页(即 65000)执行检查。 通过与代码页进行比较,可以避免出现警告,还可以处理一些边缘情况,例如,如果有人调用 new UTF7Encoding() 或子类化类型。

    void DoSomething(Encoding enc)
    {
        // Don't perform the check this way.
        // It produces a warning and misses some edge cases.
        if (enc == Encoding.UTF7)
        {
            // Encoding is UTF-7.
        }
    
        // Instead, perform the check this way.
        if (enc != null && enc.CodePage == 65000)
        {
            // Encoding is UTF-7.
        }
    }
    

抑制警告

如果必须使用已过时的 API,可在代码或项目文件中禁止显示警告。

若只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用警告。

// Disable the warning.
#pragma warning disable SYSLIB0001

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0001

若要禁止显示项目中的所有 SYSLIB0001 警告,请将属性 <NoWarn> 添加到项目文件。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0001</NoWarn>
  </PropertyGroup>
</Project>

有关详细信息,请参阅取消警告

另请参阅