我正在使用.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表单中发布 ,该怎么办?
在实际执行反序列化之前,有没有办法判断被反序列化的类型是否与给定类型匹配?
答案 0 :(得分:2)
如果你有适当的异常处理,你的类型的强制转换将失败 - 并且不会造成任何伤害。
如果您想要更多地控制数据的序列化方式,并且想要关注反序列化过程中发生的事情,那么最终需要实现自己的某种对象分类器。
甚至可能是一种简单的XML格式,这样你就可以遍历节点,如果看起来不合适,就把它抛出来。
虽然,如果你想自己解决这个问题:
以下是BinaryFormatter的官方规范:http://msdn.microsoft.com/en-us/library/cc236844(prot.20).aspx
而且,这里是较小的第三方规范:http://primates.ximian.com/~lluis/dist/binary_serialization_format.htm
使用这些资源,您将能够查看二进制流并查看序列化内容的类型。但是,似乎非常不必要。
在反序列化之后,只需对数据进行大量检查。