Sdílet prostřednictvím


Kódové dráhy UTF-7 jsou zastaralé

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 jsou vlastnost Encoding.UTF7 a konstruktory UTF7Encoding nyní zastaralé. Kromě toho Encoding.GetEncoding , a Encoding.GetEncodings již neumožňuje zadat UTF-7.

Změnit popis

Dříve jste mohli vytvořit instanci kódování UTF-7 pomocí rozhraní API Encoding.GetEncoding. Napří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 vyčíslena metodou Encoding.GetEncodings(), která uvádí seznam 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, není samotný UTF7Encoding typ označen jako 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 jednají s názvem utf-7 kodování a kódovou stránkou 65000 jako unknown. Zacházení s kódováním jako unknown způsobí, že metoda vyvolá 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 vynecháno, 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í. Škodlivý koncový bod může specifikovat Content-Type: ...; charset=utf-7, což může způsobit, že přijímající aplikace se bude chovat nevhodně.

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.

Verze byla představena

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 s názvy kódování, které poskytl nedůvěryhodný zdroj a jsou neznámé:

    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 EncodingProvider. 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é stránce kódování 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 vytvořil podtřídu pro daný 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

    Můžete potlačit SYSLIB0001 upozornění v kódu nebo v souboru .csproj vašeho projektu.

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

    Potlačení SYSLIB0001 pouze zakáže výstrahy o zastaralosti Encoding.UTF7 a UTF7Encoding. Nezakáže žádná další upozornění ani nezmění chování rozhraní API, jako je Encoding.GetEncoding.

  • Pokud musíte podporovat 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
      }
    }
    

    Návod

    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