.NET Core 技术解析:BinaryFormatter 序列化方法已过时并在 ASP.NET 应用中禁用

.NET Core 技术解析:BinaryFormatter 序列化方法已过时并在 ASP.NET 应用中禁用

背景介绍

在 .NET 生态系统中,BinaryFormatter 长期以来被用作二进制序列化和反序列化的工具。然而,随着技术的发展和安全意识的提高,微软在 .NET 5 中做出了一个重要决定:将 BinaryFormatter 相关方法标记为过时(obsolete),并在 ASP.NET 应用中默认禁用其功能。

变更内容

主要变更点

  1. 过时警告BinaryFormatterFormatterIFormatterSerializeDeserialize 方法现在会产生编译警告 SYSLIB0011

  2. ASP.NET 应用限制:在 ASP.NET Core 5.0 及更高版本的应用中,这些方法会抛出 NotSupportedException,除非显式重新启用 BinaryFormatter 功能。

  3. .NET 7 升级:在 .NET 7 中,这些 API 的过时级别从警告升级为错误,意味着代码将无法编译通过。

变更原因

这一变更主要基于以下安全考虑:

  1. 安全问题BinaryFormatter 存在已知的安全隐患,可能导致未授权的操作或系统不稳定。

  2. 不可信数据风险:当处理来自不受信任源的序列化数据时,BinaryFormatter 可能导致严重的安全问题。

  3. 生态系统健康:逐步淘汰不安全的组件有助于提高整个 .NET 生态系统的安全性。

影响范围

受影响的 API 包括:

  • BinaryFormatter.Serialize
  • BinaryFormatter.Deserialize
  • Formatter.Serialize
  • Formatter.Deserialize
  • IFormatter.Serialize
  • IFormatter.Deserialize

迁移建议

推荐替代方案

  1. JSON 序列化:使用 System.Text.Json.JsonSerializer,这是 .NET 中高性能的 JSON 序列化方案。
// 使用 System.Text.Json 替代 BinaryFormatter
var jsonString = JsonSerializer.Serialize(myObject);
var deserializedObject = JsonSerializer.Deserialize<MyType>(jsonString);
  1. XML 序列化:使用 System.Xml.Serialization.XmlSerializer,适合需要 XML 格式的场景。
// 使用 XmlSerializer 替代 BinaryFormatter
var serializer = new XmlSerializer(typeof(MyType));
using var writer = new StringWriter();
serializer.Serialize(writer, myObject);
var xmlString = writer.ToString();

临时解决方案

如果必须暂时使用 BinaryFormatter,可以通过以下方式处理警告:

  1. 局部禁用警告
#pragma warning disable SYSLIB0011
var formatter = new BinaryFormatter();
var result = (MyType)formatter.Deserialize(stream);
#pragma warning restore SYSLIB0011
  1. 项目全局禁用警告(不推荐):
<PropertyGroup>
  <NoWarn>$(NoWarn);SYSLIB0011</NoWarn>
</PropertyGroup>

ASP.NET 应用的特殊处理

如果必须在 ASP.NET 应用中使用 BinaryFormatter,需要在项目文件中显式启用:

<PropertyGroup>
  <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>

注意:强烈不建议在生产环境中这样做,除非完全理解并接受潜在的安全风险。

安全建议

  1. 全面评估风险:在使用任何序列化方案前,评估数据来源的可信度。

  2. 最小权限原则:确保反序列化代码运行在最小必要权限下。

  3. 输入验证:对所有反序列化的数据进行严格验证。

  4. 日志监控:记录和监控序列化/反序列化操作,便于安全审计。

总结

随着 .NET 生态系统的发展,安全性和可靠性变得越来越重要。BinaryFormatter 的逐步淘汰是这一趋势的体现。开发者应当尽快迁移到更安全的替代方案,如 System.Text.JsonXmlSerializer,以确保应用的安全性和未来兼容性。

对于必须暂时使用 BinaryFormatter 的场景,务必充分了解风险并采取适当的安全措施。长期来看,迁移到更现代的序列化方案是确保应用安全的最佳选择。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值