Zastaralé cesty v kódování UTF-7

Kódování UTF-7 již není široce používáno mezi aplikacemi a mnoho specifikací nyní zakázalo jeho použití ve výměně. Někdy se také používá jako vektor útoku v aplikacích, které neočekává, že narazí na data zakódovaná UTF-7. Microsoft varuje před použitím, System.Text.UTF7Encoding protože neposkytuje detekci chyb.

V důsledku toho Encoding.UTF7 jsou vlastnosti a UTF7Encoding konstruktory nyní zastaralé. Kromě toho Encoding.GetEncoding , a Encoding.GetEncodings již neumožňuje zadat UTF-7.

Změna popisu

Dříve můžete vytvořit instanci kódování UTF-7 pomocí Encoding.GetEncoding rozhraní API. Příklad:

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

Kromě toho instance, která představuje kódování UTF-7, byla uvedena Encoding.GetEncodings() metodou, která vytvoří výčet všech Encoding instancí registrovaných v systému.

Počínaje rozhraním .NET 5 Encoding.UTF7 jsou vlastnosti a UTF7Encoding konstruktory zastaralé a generují upozornění SYSLIB0001. Chcete-li však snížit počet upozornění, která volající obdrží při použití UTF7Encoding třídy, UTF7Encoding samotný typ není označen zastaralá.

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

Kromě toho Encoding.GetEncoding metody zachází s názvem utf-7 kódování a znakovou stránkou 65000 jako unknown. Zacházení s kódováním jako unknown příčiny vyvolání metody ArgumentException.

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

Nakonec metoda Encoding.GetEncodings() nezahrnuje kódování UTF-7 do EncodingInfo pole, které vrátí. Kódování je vyloučeno, protože nelze vytvořit instanci.

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

Důvod změny

Mnoho aplikací volá Encoding.GetEncoding("encoding-name") s hodnotou názvu kódování, kterou poskytuje nedůvěryhodný zdroj. Například webový klient nebo server mohou převzít charset část hlavičky Content-Type a předat hodnotu přímo Encoding.GetEncoding bez ověření. To může umožnit, aby škodlivý koncový bod určil Content-Type: ...; charset=utf-7, což by mohlo způsobit, že přijímající aplikace bude špatně chovat.

Zakázání cest kódu UTF-7 navíc umožňuje optimalizaci kompilátorů, jako jsou ty, které blazor používá, k úplné odebrání těchto cest kódu z výsledné aplikace. V důsledku toho kompilované aplikace běží efektivněji a zabírají méně místa na disku.

Zavedená verze

5,0

Ve většině případů nemusíte nic dělat. U aplikací, které dříve aktivovaly cesty kódu související s UTF-7, však zvažte následující pokyny.

  • Pokud vaše aplikace volá Encoding.GetEncoding neznámé názvy kódování poskytnuté nedůvěryhodným zdrojem:

    Místo toho porovnejte názvy kódování s konfigurovatelným seznamem povolených. Konfigurovatelný seznam povolených položek by měl obsahovat minimálně oborový standard "utf-8". V závislosti na klientech a zákonných požadavcích možná budete muset povolit také kódování specifická pro jednotlivé oblasti, například "GB18030".

    Pokud neimplementujete seznam povolených, Encoding.GetEncoding vrátí všechny Encoding , které jsou integrované do systému nebo které jsou zaregistrované prostřednictvím vlastního EncodingProviderseznamu . Auditujte požadavky vaší služby a ověřte, že se jedná o požadované chování. UTF-7 je ve výchozím nastavení zakázané, pokud vaše aplikace znovu nepovolí přepínač kompatibility uvedený dále v tomto článku.

  • Pokud používáte Encoding.UTF7 vlastní protokol nebo UTF7Encoding formát souboru:

    Přepněte na použití Encoding.UTF8 nebo UTF8Encoding. UTF-8 je oborový standard a je široce podporovaný napříč jazyky, operačními systémy a moduly runtime. Použití UTF-8 usnadňuje budoucí údržbu kódu a usnadňuje spolupráci se zbytkem ekosystému.

  • Pokud porovnáváte Encoding instanci s Encoding.UTF7:

    Místo toho zvažte provedení kontroly na dobře známé znakové stránce UTF-7, což je 65000. Porovnáním se znakovou stránkou se vyhnete upozornění a také zpracujete některé hraniční případy, například pokud někdo volal new UTF7Encoding() nebo podtříděl typ.

    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.
        }
    }
    
  • Pokud je nutné použítEncoding.UTF7:UTF7Encoding

    Upozornění v kódu nebo v souboru .csproj projektu můžete potlačitSYSLIB0001.

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

    Poznámka:

    SYSLIB0001 Potlačení zakáže Encoding.UTF7 pouze upozornění a UTF7Encoding upozornění na obsoletion. Nezakážuje žádná další upozornění ani nemění chování rozhraní API, jako Encoding.GetEncodingje .

  • Pokud potřebujete podporu Encoding.GetEncoding("utf-7", ...):

    Podporu můžete znovu povolit prostřednictvím přepínače kompatibility. Tento přepínač kompatibility lze zadat v souboru .csproj aplikace nebo v konfiguračním souboru modulu runtime, jak je znázorněno v následujících příkladech.

    V souboru .csproj aplikace:

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

    V souboru runtimeconfig.template.json aplikace:

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

    Tip

    Pokud znovu povolíte podporu pro UTF-7, měli byste provést kontrolu zabezpečení kódu, který volá Encoding.GetEncoding.

Ovlivněná rozhraní API