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 SYSLIB0001
eredmé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
Javasolt művelet
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ívtanew 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
- System.Text.Encoding.UTF7
- UTF7Encoding()
- UTF7Encoding(Boolean)
- System.Text.Encoding.GetEncoding(Int32)
- System.Text.Encoding.GetEncoding(String)
- System.Text.Encoding.GetEncoding(Int32, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncoding(String, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncodings()
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: