Školení
Modul
Formátování alfanumerických dat pro prezentaci v jazyce C# - Training
Prozkoumejte základní metody v jazyce C# pro formátování alfanumerických dat.
Tento prohlížeč se už nepodporuje.
Upgradujte na Microsoft Edge, abyste mohli využívat nejnovější funkce, aktualizace zabezpečení a technickou podporu.
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
.
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);
}
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.
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.
Zpětná vazba k produktu .NET
.NET je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby:
Školení
Modul
Formátování alfanumerických dat pro prezentaci v jazyce C# - Training
Prozkoumejte základní metody v jazyce C# pro formátování alfanumerických dat.