Partilhar via


Os caminhos de código UTF-7 estão obsoletos

A codificação UTF-7 não é mais amplamente usada entre os aplicativos, e muitas especificações agora proíbem seu uso no intercâmbio. Também é ocasionalmente usado como um vetor de ataque em aplicativos que não preveem encontrar dados codificados em UTF-7. A Microsoft adverte contra o uso de System.Text.UTF7Encoding porque não fornece deteção de erros.

Consequentemente, a Encoding.UTF7 propriedade e os UTF7Encoding construtores estão agora obsoletos. Além disso, Encoding.GetEncoding e Encoding.GetEncodings não permite mais que você especifique UTF-7.

Alterar descrição

Anteriormente, você podia criar uma instância da codificação UTF-7 usando as Encoding.GetEncoding APIs. Por exemplo:

Encoding enc1 = Encoding.GetEncoding("utf-7"); // By name.
Encoding enc2 = Encoding.GetEncoding(65000); // By code page.

Além disso, uma instância que representa a codificação UTF-7 foi enumerada pelo método Encoding.GetEncodings(), que enumera todas as instâncias Encoding registadas no sistema.

A partir do .NET 5, a propriedade Encoding.UTF7 e os construtores UTF7Encoding estão obsoletos e produzem aviso SYSLIB0001. No entanto, para reduzir o número de avisos que os chamadores recebem ao usar a UTF7Encoding classe, o UTF7Encoding tipo em si não é marcado como obsoleto.

// The next line generates warning SYSLIB0001.
UTF7Encoding enc = new UTF7Encoding();
// The next line does not generate a warning.
byte[] bytes = enc.GetBytes("Hello world!");

Além disso, os Encoding.GetEncoding métodos tratam o nome utf-7 de codificação e a página 65000 de código como unknown. Tratar a codificação como unknown faz com que o método lance uma exceção ArgumentException.

// Throws ArgumentException, same as calling Encoding.GetEncoding("unknown").
Encoding enc = Encoding.GetEncoding("utf-7");

Finalmente, o Encoding.GetEncodings() método não inclui a codificação UTF-7 na EncodingInfo matriz que ele retorna. A codificação é excluída porque não pode ser instanciada.

foreach (EncodingInfo encInfo in Encoding.GetEncodings())
{
    // The next line would throw if GetEncodings included UTF-7.
    Encoding enc = Encoding.GetEncoding(encInfo.Name);
}

Motivo da mudança

Muitos aplicativos chamam Encoding.GetEncoding("encoding-name") com um valor de nome de codificação fornecido por uma fonte não confiável. Por exemplo, um cliente ou servidor Web pode pegar a charset parte do Content-Type cabeçalho e passar o valor diretamente para Encoding.GetEncoding sem validá-lo. Isso pode permitir que um endpoint malicioso especifique Content-Type: ...; charset=utf-7, o que pode fazer com que o aplicativo receptor funcione de forma incorreta.

Além disso, desativar os caminhos de código UTF-7 permite otimizar os compiladores, como os usados por Blazor, para remover esses caminhos de código inteiramente do aplicativo resultante. Como resultado, os aplicativos compilados são executados de forma mais eficiente e ocupam menos espaço em disco.

Versão introduzida

5.0

Na maioria dos casos, você não precisa tomar nenhuma medida. No entanto, para aplicativos que ativaram anteriormente caminhos de código relacionados ao UTF-7, considere as orientações a seguir.

  • Se o seu aplicativo chamar Encoding.GetEncoding com nomes de codificação desconhecidos fornecidos por uma fonte não confiável:

    Em vez disso, compare os nomes de codificação com uma lista de permissões configurável. A lista de permissões configurável deve, no mínimo, incluir o padrão da indústria "utf-8". Dependendo de seus clientes e requisitos regulamentares, você também pode precisar permitir codificações específicas da região, como "GB18030".

    Se você não implementar uma lista de permissões, Encoding.GetEncoding retornará qualquer Encoding incorporado ao sistema ou registrado por meio de um elemento distinto EncodingProvider. Audite os requisitos do seu serviço para validar se esse é o comportamento desejado. UTF-7 continua a ser desativado por padrão, a menos que seu aplicativo reative a opção de compatibilidade mencionada posteriormente neste artigo.

  • Se estiver a utilizar Encoding.UTF7 ou UTF7Encoding dentro do seu próprio protocolo ou formato de ficheiro:

    Mudar para utilizar Encoding.UTF8 ou UTF8Encoding. UTF-8 é um padrão da indústria e é amplamente suportado em idiomas, sistemas operacionais e tempos de execução. O uso do UTF-8 facilita a manutenção futura do seu código e o torna mais interoperável com o resto do ecossistema.

  • Se você estiver comparando uma Encoding instância com Encoding.UTF7:

    Em vez disso, considere executar uma verificação na conhecida página de código UTF-7, que é 65000. Ao comparar com a página de código, evita o aviso e também lida com alguns casos-limite, como se alguém chamou new UTF7Encoding() ou subclassou o tipo.

    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.
        }
    }
    
  • Se tiver de utilizar Encoding.UTF7 ou UTF7Encoding:

    Você pode suprimir o SYSLIB0001 aviso no código ou no arquivo .csproj do seu projeto.

    #pragma warning disable SYSLIB0001 // Disable the warning.
    Encoding enc = Encoding.UTF7;
    #pragma warning restore SYSLIB0001 // Re-enable the warning.
    
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- NoWarn below suppresses SYSLIB0001 project-wide -->
       <NoWarn>$(NoWarn);SYSLIB0001</NoWarn>
      </PropertyGroup>
    </Project>
    

    Observação

    Suprimir SYSLIB0001 apenas desativa os Encoding.UTF7 avisos de obsolescência UTF7Encoding . Ele não desabilita nenhum outro aviso ou altera o comportamento de APIs como Encoding.GetEncoding.

  • Se tiver de apoiar Encoding.GetEncoding("utf-7", ...):

    Você pode reativar o suporte para isso por meio de uma opção de compatibilidade. Essa opção de compatibilidade pode ser especificada no arquivo .csproj do aplicativo ou em um arquivo de configuração de tempo de execução, conforme mostrado nos exemplos a seguir.

    No arquivo .csproj do aplicativo:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- Re-enable support for UTF-7 -->
       <EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding>
      </PropertyGroup>
    </Project>
    

    No ficheiro runtimeconfig.template.json da aplicação:

    {
      "configProperties": {
        "System.Text.Encoding.EnableUnsafeUTF7Encoding": true
      }
    }
    

    Sugestão

    Se você reativar o suporte para UTF-7, deverá executar uma revisão de segurança do código que chama Encoding.GetEncoding.

APIs afetadas