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
Doporučená akce
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 volalnew 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čit
SYSLIB0001
.#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
- 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()