Sdílet prostřednictvím


BinaryFormatter průvodce migrací

Upozornění

Důrazně nedoporučujeme používání BinaryFormatter z důvodu souvisejících bezpečnostních rizik. Stávající uživatelé by měli migrovat mimo BinaryFormatter.

Počínaje rozhraním .NET 9 už nezahrnujeme implementaci BinaryFormatter v modulu runtime. Rozhraní API jsou stále přítomna, ale jejich implementace vždy vyvolá výjimku PlatformNotSupportedException, bez ohledu na typ projektu. Proto již nastavení existujícího příznaku zpětné kompatibility nestačí k použití BinaryFormatter.

Máte dvě možnosti, jak to vyřešit:

Jaké je riziko používání BinaryFormatter?

Jakýkoli binární nebo textový deserializátor, který umožňuje vstupu nést informace o objektech, které mají být vytvořeny, představuje bezpečnostní riziko, které může nastat. Existuje běžný výčet slabosti (CWE), který popisuje problém: CWE-502 "Deserializace nedůvěryhodných dat". BinaryFormatter, zahrnutý v počáteční verzi rozhraní .NET Framework v roce 2002, je takový deserializátor. Probereme to také v průvodci zabezpečením BinaryFormater.

Vzhledem ke známým rizikům použití BinaryFormatterbyla funkce vyloučena z .NET Core 1.0. Bez jasné cesty migrace k používání něčeho bezpečnějšího vedly požadavky zákazníků k BinaryFormatter zahrnutí do .NET Core 2.0. Od té doby je tým .NET na cestě k odebrání BinaryFormatter, kdy ho pomalu vypíná ve výchozím nastavení u více typů projektů, ale uživatelům umožňuje volitelně aktivovat pomocí příznaků, pokud je to stále potřeba kvůli zpětné kompatibilitě.

Další podrobnosti o rozhodnutí najdete v oznámení BinaryFormatter o tom, že bude odstraněn v .NET 9.

Pokud dojde k BinaryFormatterproblémům způsobeným odebráním, které nejsou řešeny v této migrační příručce, zadejte problém na GitHubu na github.com/dotnet/runtime a uveďte, že problém souvisí s odebráním BinaryFormatter.

Témata migrace

Migrace mimo BinaryFormatter obvykle znamená výběr jiného serializátoru. To je ale obvykle možné jenom v případě, že řídíte producenta i příjemce zakódovaných dat. V případě, že producenta neřídíte, můžete také přejít na nové rozhraní API pro čtení BinaryFormatter datových částí bez nutnosti instancovat jakýkoli z zakódovaných typů.

Obě možnosti jsou prozkoumány níže.

Volba serializátoru

Prvním krokem při migraci z BinaryFormatter je zvolit serializátor, který se místo něj použije. V závislosti na konkrétních potřebách doporučuje tým .NET migraci na čtyři různé serializátory.

Datové části pro čtení BinaryFormatter (NRBF)

Mnoho aplikací načítá a deserializuje datové části, které byly trvalé v úložišti, a není vždy možné transformovat všechny trvalé datové části předem. Další scénáře můžou zahrnovat systémy nebo služby, které přijímají data vytvořená BinaryFormatter, kde je potřeba tyto systémy migrovat nezávisle.

V těchto scénářích a dalších případech je nutné zachovat podporu čtení zadaných datových částí a přechod do nového formátu v průběhu času. Aby bylo možné tyto potřeby splnit, je nyní možné bezpečně číst datové části NRBF vytvořené pomocí BinaryFormatter bez potřeby provádění obecné a zranitelné deserializace.

Migrace aplikací Windows Forms a WPF

Aplikace Windows Forms a WPF můžou vyžadovat další změny. Další pokyny k migraci najdete v aplikacích Windows Forms, aplikacích WPF a schránce WinForms/WPF a pokyny k přetahování myší.

Migrace spravovaných prostředků (ResX)

Nejběžnější typy prostředků (například řetězce a ikony) budou fungovat bez BinaryFormatter. U vlastních typů je potřeba přidat BinaryFormatter a povolit přepínač kompatibility, viz Načítání prostředků za běhu.

Použití balíčku kompatibility

Ve scénářích, kdy nelze provést migraci BinaryFormatter mimo dobu upgradu na .NET 9, je k dispozici nepodporovaný balíček kompatibility. System.Runtime.Serialization. Balíček NuGet formátovacích nástrojů obsahuje plně funkční implementaci BinaryFormatter, včetně jeho zranitelností a rizik.

I když není podporováno a nedoporučuje se, průvodce pro použití balíčku kompatibility obsahuje podrobnosti o instalaci balíčku a povolení funkčnosti.

Upozornění

Důrazně nedoporučujeme používání BinaryFormatter z důvodu souvisejících bezpečnostních rizik. Stávající uživatelé by měli migrovat mimo BinaryFormatter.