【问题标题】:enable the flag AllowArbitraryDataSetTypeInstantiation through code通过代码启用标志 AllowArbitraryDataSetTypeInstantiation
【发布时间】: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


【解决方案1】:

由于有可用的 AppContext 开关,您可以通过代码而不是使用 AppContext.SetSwitch 的配置文件进行设置(假设 .NET Framework 4.6.2+ 或 .Net Core)

AppContext.SetSwitch("Switch.System.Data.AllowArbitraryDataSetTypeInstantiation", true);

事实上,这种方法在您链接到的文档中进一步向下进行了概述。

请注意,您可能希望尽早执行此操作,可能是在应用程序的入口点 (Main)。

【讨论】:

  • 当我第一次阅读这篇文章时,我不记得在 Microsoft 文档中看到过对 AppContext 的引用,更不用说实际代码了。要么是微软在过去 20 小时左右添加了它,要么是我错过了它(我有点着急)。哦,好吧。
猜你喜欢
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2011-03-31
  • 2010-12-06
  • 2021-09-27
  • 2015-10-18
  • 1970-01-01
  • 2016-07-23
相关资源
最近更新 更多