Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A codificação UTF-7 não está mais em uso amplo entre aplicativos, e muitas especificações agora proíbem seu uso no intercâmbio. Ele também é usado ocasionalmente como um vetor de ataque em aplicativos que não preveem encontrar dados codificados em UTF-7. A Microsoft adverte contra o uso System.Text.UTF7Encoding porque não fornece detecção de erros.
Consequentemente, a propriedade Encoding.UTF7 e os construtores UTF7Encoding agora estão obsoletos. Além disso, Encoding.GetEncoding e Encoding.GetEncodings não permite mais que você especifique UTF-7.
Descrição da alteração
Anteriormente, você poderia 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 Encoding.GetEncodings() método, que enumera todas as Encoding instâncias registradas no sistema.
A partir do .NET 5, a propriedade Encoding.UTF7 e os construtores UTF7Encoding estão obsoletos e produzem o 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 está 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 da 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 ArgumentException.
// Throws ArgumentException, same as calling Encoding.GetEncoding("unknown").
Encoding enc = Encoding.GetEncoding("utf-7");
Por fim, o Encoding.GetEncodings() método não inclui a codificação UTF-7 na EncodingInfo matriz retornada. 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 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 Web ou servidor pode pegar a parte charset do cabeçalho Content-Type 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 receptor se comporte indevidamente.
Além disso, desabilitar caminhos de código UTF-7 permite otimizar compiladores, como os usados pelo Blazor, para remover esses caminhos de código inteiramente do aplicativo resultante. Como resultado, os aplicativos compilados são executados com mais eficiência e têm menos espaço em disco.
Versão introduzida
5,0
Ação recomendada
Na maioria dos casos, você não precisa tomar nenhuma ação. No entanto, para aplicativos que ativaram anteriormente caminhos de código relacionados ao UTF-7, considere as diretrizes 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 do setor "utf-8". Dependendo de seus clientes e requisitos regulatórios, talvez você também precise 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 que esteja incorporada ao sistema ou que esteja registrada por meio de um EncodingProvider personalizado. Audite os requisitos do serviço para validar que esse é o comportamento desejado. O UTF-7 continua desabilitado por padrão, a menos que seu aplicativo habilite novamente a opção de compatibilidade mencionada posteriormente neste artigo.
Se você estiver usando Encoding.UTF7 ou UTF7Encoding dentro do seu próprio protocolo ou formato de arquivo:
Alternar para usar Encoding.UTF8 ou UTF8Encoding. O UTF-8 é um padrão do setor e é amplamente compatível com idiomas, sistemas operacionais e runtimes. O uso do UTF-8 facilita a manutenção futura do código e o torna mais interoperável com o restante 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. Comparando com a página de código, você evita o aviso e também lida com alguns casos extremos, como se alguém chamassenew UTF7Encoding()ou subclassificasse 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 você precisar usar Encoding.UTF7 ou UTF7Encoding:
Você pode suprimir o
SYSLIB0001aviso no código ou no arquivo .csproj do 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
SYSLIB0001só desabilita os avisos de obsolescência Encoding.UTF7 e UTF7Encoding. Ele não desabilita nenhum outro aviso ou altera o comportamento de APIs como Encoding.GetEncoding.Se você precisar dar suporte a
Encoding.GetEncoding("utf-7", ...):Você pode ativar novamente o suporte para isso por meio de uma chave de compatibilidade. Essa opção de compatibilidade pode ser especificada no arquivo .csproj do aplicativo ou em um arquivo de configuração de runtime, 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 arquivo runtimeconfig.template.json do aplicativo:
{ "configProperties": { "System.Text.Encoding.EnableUnsafeUTF7Encoding": true } }Dica
Se você reabilitar o suporte para UTF-7, deverá executar uma revisão de segurança do código que chame Encoding.GetEncoding.
APIs afetadas
- System.Text.Encoding.UTF7
- UTF7Encoding()
- UTF7Encoding(Boolean)
- System.Text.Encoding.GetEncoding(Int32)
- System.Text.Encoding.GetEncoding(String)
- System.Text.Encoding.GetEncoding(Int32, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncoding(String, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncodings()