Closed gyf1214 closed 2 years ago
BinaryFormatter
System.Text.Json
Newtonsoft.Json
存档系统中大量使用了动态类型,在反序列化的时候非常容易受到ACE/RCE攻击,因此目前对存档中动态类型做如下限制:
TypeNameHandling.Auto
object
interface
Dictionary
IReadonlyDictionary
Nova.ISerializedData
IRestoreData
详见Nova.CheckpointSerializer.JsonTypeBinder
Nova.CheckpointSerializer.JsonTypeBinder
MemberSerialization.OptIn
MemberSerialization.Fields
DefaultContractResolver
IgnoreSerializableAttribute = false
SerializableAttribute
BinaryFormatter
System.Text.Json
,目前只能使用Newtonsoft.Json
安全性
存档系统中大量使用了动态类型,在反序列化的时候非常容易受到ACE/RCE攻击,因此目前对存档中动态类型做如下限制:
TypeNameHandling.Auto
,同时尽量避免序列化的字段出现object
或interface
(如使用Dictionary
而不是IReadonlyDictionary
)Nova.ISerializedData
,IRestoreData
已经继承该接口详见
Nova.CheckpointSerializer.JsonTypeBinder
序列化方式
Newtonsoft.Json
默认使用MemberSerialization.OptIn
,即只序列化/反序列化所有public field和property,我们希望的是和BinaryFormatter类似的MemberSerialization.Fields
,即序列化/反序列化所有field并忽略property,同时不需要特定构造函数。然而并没有办法指定默认的序列化方式,但是可以在DefaultContractResolver
中设置IgnoreSerializableAttribute = false
,可以使SerializableAttribute
标记的类型自动使用MemberSerialization.Fields
MemberSerialization.Fields
不需要特定构造函数,而是会使用一个不进行初始化的构造函数,虽然不知道是什么反射黑科技其他修改