1

我正在使用 .NET BinaryFormatter,以及序列化自定义对象并将其存储在网页上Convert.ToBase64String的隐藏标签中。<input>

当用户提交表单时,我会反转反序列化自定义对象的步骤:

var formatter = new BinaryFormatter();
var byteData = Convert.FromBase64String(submittedString);
var ms = new MemoryStream(byteData);
var originalObject = (MyCustomType)formatter.Deserialize(ms);

巨大的安全漏洞:如果用户巧妙地序列化一个实例MyMaliciousType并将其转换为 base-64 字符串,然后将其发布Web 表单中会怎样。

有没有办法在实际执行反序列化之前判断被反序列化的类型是否与给定类型匹配?

4

1 回答 1

2

如果您有适当的异常处理,则转换为您的类型将失败 - 并且不会造成任何伤害。

如果您想更好地控制数据的序列化方式,并且想要密切关注反序列化过程中发生的情况,您最终需要实现自己的某种对象分类器。

甚至可能是一个简单的 XML 格式,这样你就可以遍历节点,如果有什么不应该的,就把它扔掉。

虽然,如果你想自己解决这个问题:

这是 BinaryFormatter 的官方规范:http: //msdn.microsoft.com/en-us/library/cc236844
(prot.20).aspx 而且,这里是更小的第三方规范:http:// primates.ximian.com/~lluis/dist/binary_serialization_format.htm

使用这些资源,您将能够窥视二进制流并查看序列化内容的类型。不过,似乎很没必要。

只需在反序列化后对数据进行广泛检查。

于 2012-11-12T02:22:37.277 回答