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 porque não fornece deteção de System.Text.UTF7Encoding erros.

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

Alterar a 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 Encoding.GetEncodings() pelo método, que enumera todas as Encoding instâncias registradas no sistema.

A partir do .NET 5, a propriedade e UTF7Encoding os construtores estão obsoletos Encoding.UTF7 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 um ArgumentExceptionarquivo .

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

Razão para a alteração

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 ponto de extremidade mal-intencionado especifique Content-Type: ...; charset=utf-7, o que pode fazer com que o aplicativo recetor se comporte incorretamente.

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 uma que esteja incorporada ao sistema ou que esteja registrada por meio de um arquivo .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, você evita o aviso e também lida com alguns casos de borda, como se alguém ligou new UTF7Encoding() ou subclassificou 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>
    

    Nota

    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 de runtimeconfig.template.json da aplicação:

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

    Gorjeta

    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