Megosztás a következőn keresztül:


Az UTF-7 kódútvonalak elavultak

Az UTF-7 kódolás már nem széles körben használható az alkalmazások körében, és számos specifikáció tiltja a használatot a felcserélésben. Időnként támadási vektorként is használják olyan alkalmazásokban, amelyek nem számítanak az UTF-7 kódolású adatokkal való találkozásra. A Microsoft óva int a System.Text.UTF7Encoding használattól, mert nem biztosít hibaészlelést.

Következésképpen az ingatlan és UTF7Encoding a Encoding.UTF7 konstruktorok elavultak. Emellett, Encoding.GetEncoding és Encoding.GetEncodings a továbbiakban nem engedélyezi a beállítását UTF-7.

Módosítás leírása

Korábban az API-k használatával létrehozhatta az UTF-7 kódolás egy példányát Encoding.GetEncoding . Példa:

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

Emellett az UTF-7 kódolást jelképező példányt a metódus számba Encoding.GetEncodings() vette, amely számba vette a Encoding rendszeren regisztrált összes példányt.

A .NET 5-től kezdve a tulajdonság és UTF7Encoding a Encoding.UTF7 konstruktorok elavultak, és figyelmeztetést SYSLIB0001eredményeznek. A hívók által az UTF7Encoding osztály használatakor kapott figyelmeztetések számának csökkentése érdekében azonban maga a UTF7Encoding típus nem lesz elavultként megjelölve.

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

A metódusok emellett a Encoding.GetEncoding kódolási nevet utf-7 és a kódlapot 65000 is a következőképpen kezelik unknown. A kódolás kezelése, amely unknown miatt a metódus eldob egy ArgumentException.

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

Végül a Encoding.GetEncodings() metódus nem tartalmazza az UTF-7 kódolást a EncodingInfo visszaadott tömbben. A kódolás ki van zárva, mert nem hozható létre példányosítva.

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

A változás oka

Sok alkalmazás olyan kódolási névértékkel hív meg Encoding.GetEncoding("encoding-name") , amelyet nem megbízható forrás biztosít. Előfordulhat például, hogy egy webes ügyfél vagy kiszolgáló a charset fejléc egy részét Content-Type veszi át, és az értéket közvetlenül Encoding.GetEncoding átadja annak ellenőrzése nélkül. Ez lehetővé teheti egy rosszindulatú végpont megadását Content-Type: ...; charset=utf-7, ami a fogadó alkalmazás helytelen viselkedését okozhatja.

Emellett az UTF-7 kódútvonalak letiltása lehetővé teszi a fordítók( például a Blazor által használtak) optimalizálását, hogy teljesen eltávolítsák ezeket a kódútvonalakat az eredményül kapott alkalmazásból. Ennek eredményeképpen a lefordított alkalmazások hatékonyabban futnak, és kevesebb lemezterületet vesznek igénybe.

Bevezetett verzió

5,0

A legtöbb esetben nem kell semmilyen műveletet elvégeznie. Az olyan alkalmazások esetében azonban, amelyek korábban aktiválták az UTF-7-hez kapcsolódó kódútvonalakat, tekintse meg az alábbi útmutatást.

  • Ha az alkalmazás ismeretlen kódolási névvel hív Encoding.GetEncoding meg egy nem megbízható forrást:

    Ehelyett hasonlítsa össze a kódolási neveket egy konfigurálható engedélyezési listával. A konfigurálható engedélyezési listának legalább tartalmaznia kell az iparági szabványnak megfelelő "utf-8" értéket. Az ügyfelektől és a szabályozási követelményektől függően előfordulhat, hogy régióspecifikus kódolásokat is engedélyeznie kell, például a "GB18030".

    Ha nem implementál engedélyezési listát, Encoding.GetEncoding visszaadja a rendszerbe beépített vagy egyénien EncodingProviderregisztráltakatEncoding. A szolgáltatás követelményeinek naplózásával ellenőrizze, hogy ez-e a kívánt viselkedés. Az UTF-7 alapértelmezés szerint továbbra is le van tiltva, kivéve, ha az alkalmazás újra engedélyezi a cikkben később említett kompatibilitási kapcsolót.

  • Ha saját protokollt vagy UTF7Encoding fájlformátumot használ vagy használEncoding.UTF7:

    Váltás a következőre: használat Encoding.UTF8 vagy UTF8Encoding. Az UTF-8 iparági szabvány, és széles körben támogatott nyelvek, operációs rendszerek és futtatókörnyezetek között. Az UTF-8 használata megkönnyíti a kód későbbi karbantartását, és az ökoszisztéma többi részével való együttműködését teszi lehetővé.

  • Ha összehasonlít egy példányt Encoding a következőval Encoding.UTF7:

    Ehelyett érdemes lehet ellenőrizni a jól ismert UTF-7 kódlapot, amely a 65000. Ha összehasonlítja a kódlapot, elkerülheti a figyelmeztetést, és bizonyos peremes eseteket is kezelhet, például ha valaki meghívta new UTF7Encoding() vagy alosztályozza a típust.

    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.
        }
    }
    
  • Ha a következőt UTF7Encodingkell használniaEncoding.UTF7:

    A figyelmeztetést SYSLIB0001 kódban vagy a projekt .csproj fájljában is letilthatja.

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

    Feljegyzés

    A letiltás SYSLIB0001 csak az Encoding.UTF7 elrejtési figyelmeztetéseket UTF7Encoding tiltja le. Nem tilt le más figyelmeztetéseket, és nem módosítja az API-k viselkedését, például Encoding.GetEncoding.

  • Ha a következőt kell támogatnia Encoding.GetEncoding("utf-7", ...):

    Ehhez a kompatibilitási kapcsolóval újra engedélyezheti a támogatást. Ez a kompatibilitási kapcsoló megadható az alkalmazás .csproj fájljában vagy egy futtatókörnyezeti konfigurációs fájlban, ahogyan az alábbi példákban is látható.

    Az alkalmazás .csproj fájljában:

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

    Az alkalmazás runtimeconfig.template.json fájljában:

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

    Tipp.

    Ha újra engedélyezi az UTF-7 támogatását, biztonsági felülvizsgálatot kell végeznie a hívó kódról Encoding.GetEncoding.

Érintett API-k