Partager via


Les chemins d’accès en code UTF-7 sont obsolètes

L’encodage UTF-7 n’est plus utilisé à grande échelle parmi les applications, et de nombreuses spécifications interdisent désormais son utilisation dans l’échange. Il est également parfois utilisé comme vecteur d’attaque dans les applications qui ne prévoient pas de rencontrer des données encodées UTF-7. Microsoft avertit contre l'utilisation de System.Text.UTF7Encoding car il ne fournit pas de détection d'erreur.

Par conséquent, la propriété Encoding.UTF7 et les constructeurs UTF7Encoding sont désormais obsolètes. En outre, Encoding.GetEncoding et Encoding.GetEncodings ne vous autorise plus à spécifier UTF-7.

Description de la modification

Auparavant, vous pouvez créer une instance de l’encodage UTF-7 à l’aide Encoding.GetEncoding des API. Par exemple:

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

En outre, une instance qui représente l’encodage UTF-7 a été énumérée par la Encoding.GetEncodings() méthode, qui énumère toutes les Encoding instances inscrites sur le système.

À compter de .NET 5, la propriété Encoding.UTF7 et les constructeurs UTF7Encoding sont obsolètes et produisent un avertissement SYSLIB0001. Toutefois, pour réduire le nombre d’avertissements reçus par les appelants lors de l’utilisation de la UTF7Encoding classe, le UTF7Encoding type lui-même n’est pas marqué comme obsolète.

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

En outre, les Encoding.GetEncoding méthodes traitent le nom utf-7 d’encodage et la page 65000 de codes comme unknown. Traiter l’encodage comme unknown provoque le lancement d’une ArgumentException.

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

Enfin, la Encoding.GetEncodings() méthode n’inclut pas l’encodage UTF-7 dans le EncodingInfo tableau qu’elle retourne. L’encodage est exclu, car il ne peut pas être instancié.

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

Raison de la modification

De nombreuses applications appellent Encoding.GetEncoding("encoding-name") avec une valeur de nom d’encodage fournie par une source non approuvée. Par exemple, un client web ou un serveur pourrait prendre la portion charset de l’en-tête Content-Type et transmettre directement la valeur à Encoding.GetEncoding sans la valider. Cela peut permettre à un point de terminaison malveillant de spécifier Content-Type: ...; charset=utf-7, ce qui peut entraîner un dysfonctionnement de l'application de réception.

En outre, la désactivation des chemins de code UTF-7 permet d’optimiser les compilateurs, tels que ceux utilisés par Blazor, pour supprimer entièrement ces chemins de code de l’application résultante. Par conséquent, les applications compilées s’exécutent plus efficacement et prennent moins d’espace disque.

Version introduite

5,0

Dans la plupart des cas, vous n’avez pas besoin d’effectuer d’action. Toutefois, pour les applications qui ont précédemment activé les chemins de code liés à UTF-7, tenez compte des instructions ci-dessous.

  • Si votre application appelle Encoding.GetEncoding des noms d’encodage inconnus fournis par une source non approuvée :

    Au lieu de cela, comparez les noms d’encodage à une liste d'autorisation configurable. La liste d'autorisation configurable doit inclure au minimum la norme « utf-8 ». Selon vos clients et vos exigences réglementaires, vous devrez peut-être également autoriser des encodages spécifiques à la région, tels que « GB18030 ».

    Si vous n’implémentez pas de liste d'autorisation, Encoding.GetEncoding retournera tout élément Encoding intégré au système ou inscrit via un composant personnalisé EncodingProvider. Auditez les exigences de votre service pour vérifier qu’il s’agit du comportement souhaité. UTF-7 continue d’être désactivé par défaut, sauf si votre application réactive le commutateur de compatibilité mentionné plus loin dans cet article.

  • Si vous utilisez Encoding.UTF7 ou UTF7Encoding au sein de votre propre protocole ou format de fichier :

    Basculez vers l’utilisation Encoding.UTF8 ou UTF8Encoding. UTF-8 est une norme du secteur et est largement prise en charge dans les langages, les systèmes d’exploitation et les runtimes. L’utilisation de UTF-8 facilite la maintenance future de votre code et la rend plus interopérable avec le reste de l’écosystème.

  • Si vous comparez une Encoding instance par rapport Encoding.UTF7à :

    Au lieu de cela, envisagez d’effectuer une vérification sur la page de codes UTF-7 connue, c’est-à-dire 65000. En comparant avec la page de codes, vous évitez l’avertissement et gérez également certains cas limites, par exemple si quelqu’un a appelé une fonction new UTF7Encoding() ou créé une sous-classe du type.

    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.
        }
    }
    
  • Si vous devez utiliser Encoding.UTF7 ou UTF7Encoding:

    Vous pouvez supprimer l’avertissement dans le SYSLIB0001 code ou dans le fichier .csproj de votre projet.

    #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>
    

    Remarque

    Supprimer SYSLIB0001 désactive uniquement les avertissements Encoding.UTF7 et les warnings d’obsolescence UTF7Encoding. Il ne désactive aucun autre avertissement ou ne modifie pas le comportement des API comme Encoding.GetEncoding.

  • Si vous devez supporter Encoding.GetEncoding("utf-7", ...) :

    Vous pouvez réactiver la prise en charge de cette fonctionnalité via un commutateur de compatibilité. Ce commutateur de compatibilité peut être spécifié dans le fichier .csproj de l’application ou dans un fichier de configuration runtime, comme illustré dans les exemples suivants.

    Dans le fichier .csproj de l’application :

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

    Dans le fichier runtimeconfig.template.json de l’application :

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

    Conseil / Astuce

    Si vous réactivez la prise en charge d'UTF-7, vous devez effectuer une analyse de sécurité du code qui appelle Encoding.GetEncoding.

API affectées