Поделиться через


BinaryFormatter Руководство по миграции

Осторожность

Мы настоятельно не рекомендуем использовать BinaryFormatter из-за связанных рисков безопасности. Существующие пользователи должны отказаться от использования BinaryFormatter.

Начиная с .NET 9, мы больше не включаем реализацию BinaryFormatter в среду выполнения. API-интерфейсы по-прежнему присутствуют, но их реализация всегда вызывает PlatformNotSupportedException исключение, независимо от типа проекта. Поэтому установка существующего флага обратной совместимости больше не достаточно для использования BinaryFormatter.

У вас есть два варианта решения.

  • Миграция от BinaryFormatter. Настоятельно рекомендуется изучить варианты остановки использования BinaryFormatter из-за связанных рисков безопасности. Ниже перечислены несколько вариантов .

  • Продолжайте использовать BinaryFormatter. Если вам нужно продолжить использование BinaryFormatter в .NET 9, необходимо зависеть от неподдерживаемого пакета NuGet System.Runtime.Serialization.Formatters, который заменяет выбрасывающую реализацию.

Что такое риск использования BinaryFormatter?

Любой десериализатор, двоичный или текстовый код, который позволяет входным данным передавать сведения о создаваемых объектах— это проблема безопасности, ожидающая возникновения. Существует общее перечисление слабых мест (CWE), описывающее проблему: CWE-502 "Десериализация ненадежных данных". BinaryFormatter, который был включен в первоначальный выпуск .NET Framework в 2002 году, является таким десериализатором. Мы также рассмотрим это в руководстве по безопасности BinaryFormater.

Из-за известных рисков использования BinaryFormatterфункциональные возможности были исключены из .NET Core 1.0. Но без четкого пути миграции к использованию чего-то более безопасного, спрос клиентов привел к BinaryFormatter включению в .NET Core 2.0. С тех пор команда .NET находилась в процессе удаления BinaryFormatter, медленно отключая его по умолчанию в нескольких типах проектов, но позволяя пользователям включать его с помощью флагов, если по-прежнему необходима обратная совместимость.

Дополнительные сведения о решении см. в BinaryFormatter объявлении о том, что удаляется в .NET 9.

Если вы сталкиваетесь с проблемами, связанными с удалением BinaryFormatter, которые не затронуты в этом руководстве по миграции, создайте запрос на github.com/dotnet/runtime и укажите, что проблема связана с удалением BinaryFormatter.

Разделы о миграции

Миграция от BinaryFormatter обычно означает выбор другого сериализатора. Однако это обычно можно сделать только в том случае, если вы управляете как производителем, так и потребителем закодированных данных. Если вы не управляете производителем, вы также можете перейти к новому API для чтения BinaryFormatter полезных данных без создания экземпляров любого из закодированных типов.

Оба варианта рассматриваются ниже.

Выбор сериализатора

Первым шагом миграции BinaryFormatter является выбор сериализатора для использования вместо него. В зависимости от ваших потребностей команда .NET рекомендует миграцию на четыре разных сериализатора.

Полезные данные чтения BinaryFormatter (NRBF)

Многие приложения загружают и десериализируют полезные нагрузки, которые были сохранены в хранилище, и не всегда можно преобразовывать все сохраненные полезные нагрузки заранее. Другие сценарии могут включать в себя системы или службы, получающие данные, созданные BinaryFormatterс помощью этих систем, где эти системы должны быть перенесены независимо.

В этих сценариях и других аналогичных ситуациях необходимо сохранить поддержку чтения предоставленных полезных данных и перехода на новый формат со временем. Для удовлетворения этих потребностей теперь можно безопасно считывать полезные данные NRBF, созданные без выполнения десериализации общего назначения, которая может быть уязвимой.

Перенос приложений Windows Forms и WPF

Для приложений Windows Forms и WPF могут потребоваться дополнительные изменения. Дополнительные рекомендации по миграции см. в приложениях Windows Forms, приложениях WPF и буфере обмена WinForms/WPF и руководстве по перетаскиваниям.

Перенос управляемых ресурсов (ResX)

Наиболее распространенные типы ресурсов (например, строки и значки) будут работать без BinaryFormatter. Для пользовательских типов необходимо включить BinaryFormatter и включить параметр совместимости, см. раздел "Загрузка ресурса во время выполнения".

Использование пакета совместимости

В сценариях, когда миграция от BinaryFormatter не может быть выполнена во время обновления до .NET 9, доступен неподдерживаемый пакет совместимости. Пакет System.Runtime.Serialization.Formatters в NuGet содержит работающую реализацию BinaryFormatter, включая её уязвимости и риски.

Хотя не поддерживается и не рекомендуется, руководство по использованию пакета совместимости содержит сведения об установке пакета и включении функциональных возможностей.

Осторожность

Мы настоятельно не рекомендуем использовать BinaryFormatter из-за связанных рисков безопасности. Существующие пользователи должны отказаться от использования BinaryFormatter.