Dela via


UTF-7-kodsökvägar är föråldrade

UTF-7-kodningen är inte längre i bred användning bland program, och många specifikationer förbjuder nu dess användning i utbyte. Det används också ibland som en attackvektor i program som inte förväntar sig att stöta på UTF-7-kodade data. Microsoft varnar för användning av System.Text.UTF7Encoding eftersom det inte ger felidentifiering.

Därför Encoding.UTF7 är egenskapen och UTF7Encoding konstruktorerna nu föråldrade. Dessutom Encoding.GetEncoding kan du Encoding.GetEncodings inte längre ange UTF-7.

Ändra beskrivning

Tidigare kunde du skapa en instans av UTF-7-kodningen med hjälp av API:erna Encoding.GetEncoding . Till exempel:

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

Dessutom räknas en instans som representerar UTF-7-kodningen upp med Encoding.GetEncodings() metoden som räknar upp alla Encoding instanser som är registrerade i systemet.

Från och med .NET 5 Encoding.UTF7 är egenskapen och UTF7Encoding konstruktorerna föråldrade och skapar en varning SYSLIB0001. Men för att minska antalet varningar som anropare får när de UTF7Encoding använder klassen är UTF7Encoding själva typen inte markerad som föråldrad.

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

Dessutom Encoding.GetEncoding behandlar metoderna kodningsnamnet utf-7 och kodsidan 65000 som unknown. Att behandla kodningen som unknown gör att metoden genererar en ArgumentException.

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

Slutligen Encoding.GetEncodings() innehåller metoden inte UTF-7-kodningen i matrisen som den EncodingInfo returnerar. Kodningen undantas eftersom den inte kan instansieras.

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

Orsak till ändringen

Många program anropar Encoding.GetEncoding("encoding-name") med ett kodningsnamnvärde som tillhandahålls av en ej betrodd källa. En webbklient eller server kan till exempel ta delen charset av Content-Type huvudet och skicka värdet direkt till utan att Encoding.GetEncoding verifiera det. Detta kan göra det möjligt för en skadlig slutpunkt att ange Content-Type: ...; charset=utf-7, vilket kan leda till att det mottagande programmet fungerar felaktigt.

Om du inaktiverar UTF-7-kodsökvägar kan du dessutom optimera kompilatorer, till exempel de som används av Blazor, för att ta bort dessa kodsökvägar helt från det resulterande programmet. Därför körs de kompilerade programmen mer effektivt och tar mindre diskutrymme.

Version introducerad

5,0

I de flesta fall behöver du inte vidta några åtgärder. För appar som tidigare har aktiverat UTF-7-relaterade kodsökvägar bör du dock överväga den vägledning som följer.

  • Om appen anropar Encoding.GetEncoding med okända kodningsnamn som tillhandahålls av en ej betrodd källa:

    Jämför i stället kodningsnamnen med en konfigurerbar lista över tillåtna. Listan över konfigurerbara tillåtna bör minst innehålla branschstandarden "utf-8". Beroende på dina klienter och regelkrav kan du också behöva tillåta regionspecifika kodningar, till exempel "GB18030".

    Om du inte implementerar en lista över Encoding.GetEncoding tillåtna returneras alla Encoding som är inbyggda i systemet eller som har registrerats via en anpassad EncodingProvider. Granska tjänstens krav för att verifiera att detta är det önskade beteendet. UTF-7 fortsätter att vara inaktiverat som standard såvida inte programmet återaktiverar kompatibilitetsväxeln som nämns senare i den här artikeln.

  • Om du använder Encoding.UTF7 eller UTF7Encoding inom ditt eget protokoll eller filformat:

    Växla till att använda Encoding.UTF8 eller UTF8Encoding. UTF-8 är en branschstandard och stöds i stor utsträckning på olika språk, operativsystem och körningsmiljöer. Att använda UTF-8 underlättar framtida underhåll av din kod och gör den mer driftskompatibel med resten av ekosystemet.

  • Om du jämför en Encoding instans med Encoding.UTF7:

    Överväg i stället att utföra en kontroll mot den välkända UTF-7-kodsidan, som är 65000. Genom att jämföra med kodsidan undviker du varningen och hanterar även vissa gränsfall, till exempel om någon anropade new UTF7Encoding() eller underklassade typen.

    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.
        }
    }
    
  • Om du måste använda Encoding.UTF7 eller UTF7Encoding:

    Du kan utelämna varningen SYSLIB0001 i koden eller i projektets .csproj-fil .

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

    Kommentar

    Om du utelämnar SYSLIB0001 inaktiveras Encoding.UTF7 bara varningarna och UTF7Encoding obsoletionen. Den inaktiverar inte några andra varningar eller ändrar beteendet för API:er som Encoding.GetEncoding.

  • Om du måste ha stöd Encoding.GetEncoding("utf-7", ...)för :

    Du kan återaktivera stöd för detta via en kompatibilitetsväxel. Den här kompatibilitetsväxeln kan anges i programmets .csproj-fil eller i en körningskonfigurationsfil, som du ser i följande exempel.

    I programmets .csproj-fil :

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

    I programmets runtimeconfig.template.json-fil :

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

    Dricks

    Om du återaktiverar stöd för UTF-7 bör du utföra en säkerhetsgranskning av kod som anropar Encoding.GetEncoding.

Berörda API:er