【发布时间】:2020-11-10 04:49:38
【问题描述】:
在过去几天、几周或几个月中,Microsoft 发布了一个针对 .Net 框架的补丁,如果涉及自定义类型,该补丁会破坏使用 DataSet/DataTable 的序列化。见https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable-dataview/security-guidance。他们提供了几种方法来重新启用自定义类型序列化。
有一种机制可以通过代码启用特定类型(从文章中粘贴):
Type[] extraAllowedTypes = new Type[]
{
typeof(Fabrikam.CustomType),
typeof(Contoso.AdditionalCustomType)
};
AppDomain.CurrentDomain.SetData("System.Data.DataSetDefaultAllowedTypes", extraAllowedTypes);
还有一种机制可以为所有类型启用序列化/反序列化,但我只看到如何通过配置文件做到这一点:
<configuration>
<runtime>
<!-- Warning: setting the following switch can introduce a security problem. -->
<AppContextSwitchOverrides value="Switch.System.Data.AllowArbitraryDataSetTypeInstantiation=true" />
</runtime>
</configuration>
上述安全问题不适用于我的情况,因为我的程序的几个部分之间的序列化是私有的,序列化的表单永远不会存储,并且通信链接通过 TLS 保护和验证。
找到我需要列入白名单的所有自定义类型将非常繁重,而且在我的情况下部署修改后的配置文件也很困难。
我正在寻找一种使用代码为所有类型启用自定义类型序列化的方法。我环顾四周,但没有发现任何东西。有谁知道怎么做?
(谢谢)
【问题讨论】:
-
该链接仅适用于 DataTable 和 DataSets。你有一个自定义的二进制序列化和链接不适用,除非你有一个 DataTable 或 DataSet。当您使用一个版本的 Net 序列化并使用不同版本的 Net 反序列化时,二进制序列化可能不起作用。我敢打赌,如果您使用最新版本的 Net 进行序列化,然后使用相同版本进行反序列化,您的代码将可以正常工作。
标签: c# .net deserialization