Share via


UTF-7-codepaden zijn verouderd

De UTF-7-codering is niet langer in breed gebruik tussen toepassingen en veel specificaties verbieden nu het gebruik ervan in uitwisseling. Het wordt ook af en toe gebruikt als een aanvalsvector in toepassingen die niet verwachten dat er UTF-7-gecodeerde gegevens optreden. Microsoft waarschuwt voor het gebruik van System.Text.UTF7Encoding omdat er geen foutdetectie wordt geboden.

Daarom zijn de Encoding.UTF7 eigenschap en UTF7Encoding constructors nu verouderd. Encoding.GetEncodingEncoding.GetEncodings Daarnaast kunt u niet meer opgevenUTF-7.

Wijzigingsbeschrijving

Eerder kunt u een exemplaar van de UTF-7-codering maken met behulp van de Encoding.GetEncoding API's. Voorbeeld:

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

Daarnaast is een exemplaar dat de UTF-7-codering vertegenwoordigt, geïnventariseerd door de Encoding.GetEncodings() methode, waarin alle Encoding exemplaren worden opgesomd die zijn geregistreerd op het systeem.

Vanaf .NET 5 zijn de Encoding.UTF7 eigenschappen en UTF7Encoding constructors verouderd en produceren ze een waarschuwing SYSLIB0001. Als u echter het aantal waarschuwingen wilt verminderen dat bellers ontvangen bij het gebruik van de UTF7Encoding klasse, wordt het UTF7Encoding type zelf niet gemarkeerd als verouderd.

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

Daarnaast behandelen de Encoding.GetEncoding methoden de coderingsnaam utf-7 en de codepagina 65000 als unknown. Het behandelen van de codering als unknown oorzaken van de methode om een ArgumentException.

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

Ten slotte bevat de Encoding.GetEncodings() methode de UTF-7-codering niet in de EncodingInfo matrix die wordt geretourneerd. De codering wordt uitgesloten omdat deze niet kan worden geïnstantieerd.

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

Reden voor wijziging

Veel toepassingen roepen Encoding.GetEncoding("encoding-name") een coderingsnaamwaarde aan die wordt geleverd door een niet-vertrouwde bron. Een webclient of -server kan bijvoorbeeld het charset gedeelte van de Content-Type header nemen en de waarde rechtstreeks Encoding.GetEncoding doorgeven zonder deze te valideren. Hierdoor kan een schadelijk eindpunt worden opgegeven Content-Type: ...; charset=utf-7, waardoor de ontvangende toepassing zich misdraagt.

Bovendien kunt u met het uitschakelen van UTF-7-codepaden compilers, zoals die die door Blazor worden gebruikt, deze codepaden volledig verwijderen uit de resulterende toepassing. Hierdoor worden de gecompileerde toepassingen efficiënter uitgevoerd en nemen ze minder schijfruimte in beslag.

Versie geïntroduceerd

5,0

In de meeste gevallen hoeft u geen actie te ondernemen. Voor apps die eerder UTF-7-gerelateerde codepaden hebben geactiveerd, moet u echter rekening houden met de volgende richtlijnen.

  • Als uw app aanroept Encoding.GetEncoding met onbekende coderingsnamen die worden geleverd door een niet-vertrouwde bron:

    Vergelijk in plaats daarvan de coderingsnamen met een configureerbare acceptatielijst. De configureerbare acceptatielijst moet minimaal de industriestandaard utf-8 bevatten. Afhankelijk van uw clients en wettelijke vereisten, moet u mogelijk ook regiospecifieke coderingen toestaan, zoals 'GB18030'.

    Als u geen acceptatielijst implementeert, Encoding.GetEncoding retourneert Encoding u een lijst die is ingebouwd in het systeem of die is geregistreerd via een aangepaste EncodingProviderlijst. Controleer de vereisten van uw service om te controleren of dit het gewenste gedrag is. UTF-7 blijft standaard uitgeschakeld, tenzij uw toepassing de compatibiliteitsswitch die verderop in dit artikel wordt vermeld, opnieuw inschakelt.

  • Als u Encoding.UTF7 uw eigen protocol of UTF7Encoding bestandsindeling gebruikt:

    Schakel over naar het gebruik Encoding.UTF8 of UTF8Encoding. UTF-8 is een industriestandaard en wordt breed ondersteund in talen, besturingssystemen en runtimes. Het gebruik van UTF-8 vereenvoudigt het toekomstige onderhoud van uw code en maakt het beter compatibel met de rest van het ecosysteem.

  • Als u een Encoding instantie vergelijkt met Encoding.UTF7:

    In plaats daarvan kunt u overwegen om een controle uit te voeren op de bekende UTF-7-codepagina, namelijk 65000. Door de codepagina te vergelijken, vermijdt u de waarschuwing en verwerkt u ook enkele edge-gevallen, bijvoorbeeld als iemand het type aangeroepen of subklasse heeft aangeroepen 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.
        }
    }
    
  • Als u het volgende moet gebruiken Encoding.UTF7 of UTF7Encoding:

    U kunt de SYSLIB0001 waarschuwing in code of in het .csproj-bestand van uw project onderdrukken.

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

    Notitie

    Als u SYSLIB0001 onderdrukt, worden alleen de Encoding.UTF7 waarschuwingen en UTF7Encoding waarschuwingen voor verhullend gebruik uitgeschakeld. Er worden geen andere waarschuwingen uitgeschakeld of het gedrag van API's Encoding.GetEncodingzoals .

  • Als u ondersteuning moet bieden voor Encoding.GetEncoding("utf-7", ...):

    U kunt hiervoor ondersteuning opnieuw inschakelen via een compatibiliteitsswitch. Deze compatibiliteitsswitch kan worden opgegeven in het .csproj-bestand van de toepassing of in een runtimeconfiguratiebestand, zoals wordt weergegeven in de volgende voorbeelden.

    In het bestand .csproj van de toepassing:

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

    In het runtimeconfig.template.json-bestand van de toepassing:

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

    Tip

    Als u ondersteuning voor UTF-7 opnieuw inschakelt, moet u een beveiligingsbeoordeling uitvoeren van code die wordt aanroepen Encoding.GetEncoding.

Betrokken API's