Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 二进制序列化本质上是不安全的吗?_C#_Binaryformatter - Fatal编程技术网

C# 二进制序列化本质上是不安全的吗?

C# 二进制序列化本质上是不安全的吗?,c#,binaryformatter,C#,Binaryformatter,Microsoft警告不要使用(他们写道,没有办法使反序列化安全) 应用程序应尽快停止使用BinaryFormatter, 即使他们相信他们正在处理的数据是可信的 我不想使用基于XML或Json的解决方案(它们指的就是这些解决方案)。我关心的是文件大小和对象图的保存 如果我要编写自己的方法来遍历对象图并将对象转换为二进制,那么这是安全的,还是从二进制转换而来的特定方法会使文本本身更加危险?是否有二进制(非XML和非JSON)替代BinaryFormatter? 这个问题让人觉得它会带来更多基于观

Microsoft警告不要使用(他们写道,没有办法使反序列化安全)

应用程序应尽快停止使用BinaryFormatter, 即使他们相信他们正在处理的数据是可信的

我不想使用基于XMLJson的解决方案(它们指的就是这些解决方案)。我关心的是文件大小和对象图的保存

如果我要编写自己的方法来遍历对象图并将对象转换为二进制,那么这是安全的,还是从二进制转换而来的特定方法会使文本本身更加危险?

是否有二进制(非XML和非JSON)替代
BinaryFormatter
? 这个问题让人觉得它会带来更多基于观点的答案

我肯定有很多库,但也许最著名的替代方案是(protobuf)。这是一个谷歌图书馆,因此它得到了大量的发展和关注。然而,并非所有人都同意使用protobuf进行通用二进制序列化是最好的做法

如果您想了解更多信息,请在github for dotnet上执行此操作;它讨论了BinaryFormatter的一般问题,以及使用protobuf作为替代方案

我可以创建自己的安全二进制序列化系统吗? 对。也就是说,真正的问题应该是:“值得我花时间这么做吗?”

有关
二进制格式化程序的关闭计划,请参见此链接:

在最底层,您会发现:

为什么不让
二进制格式化程序
对不受信任的有效负载安全?

BinaryFormatter
协议通过指定 对象的原始实例字段。换句话说,整个
BinaryFormatter
是绕过对象的典型构造函数 使用私有反射将实例字段设置为 通过电线进来的。以这种方式绕过构造函数意味着 对象无法执行任何验证或其他保证 它的内部不变量是满足的。这样做的一个后果是 即使对于看似无害的类型,
BinaryFormatter
也是不安全的 例如
异常
列表
字典
, 不管T、TKey或TValue的实际类型如何。 将反序列化限制为允许的类型列表将不起作用 解决这个问题

安全性问题不是将二进制序列化作为一个概念;问题在于如何实现
BinaryFormatter

如果需要,您可以设计一个安全的二进制反序列化系统。如果发送的消息很少,并且可以严格控制反序列化的类型,那么创建一个安全的系统可能不需要太多努力

然而,对于一个足够灵活的系统,可以处理许多不同的用例(例如,可以反序列化的许多不同类型),您可能会发现构建足够的安全检查需要付出大量的努力



FWIW,如果安全系统提供同样广泛的实用程序(用例),您可能永远无法达到
BinaryFormatter
的性能水平,因为
BinaryFormatter
的速度(部分)来自于很少的安全功能。您可以使用一个目标明确的小型系统来达到这样的性能级别,该系统的用例集很窄。

Json/xml有什么反对意见?@Caius Jard主要是大小/性能。如果我能改进这个问题,请告诉我。谢谢->gzip它。性能->滚动您自己的协议。你应该测试这两个问题是否真的是一个问题;对于世界上很高比例的系统来说,它显然不是;gzip'd(由Web服务器提供)Json非常常见,要使二进制序列化安全,需要两件事:1.)当前加载的类型不能被攻击,2.)在反序列化过程中不允许加载程序集
BinaryFormatter
uses.2.),这是一个巨大的安全风险,因为它可以运行任何代码。1.)有点棘手,因为可能存在未发现的漏洞,但.NET Core在许多有害类型上禁用了
[Serializable]
。您可以随意尝试,它速度非常快,而且还支持安全模式。“即使对于看似无害的类型”-
Dictionary
实际上也实现了
ISerializable
,因此它毕竟可以验证输入(但它没有这样做)。并且(免责声明:由我编写)可以在本机上支持公共集合类型,从而使它们的序列化既安全又非常安全。当然,如果某些字段可能具有无效值,则应避免使用默认的基于字段的序列化。另见