我让 protobuf.net 将无效(随机)字节反序列化为 KeyValuePair(即不可为空)。不是(如预期的那样)抛出异常,而是返回了一个空结构。
由于此默认结构可能是有效数据,因此我看不到判断源数据是否实际有效的方法。这是一个错误,还是我错过了一种方法?
(protobuf-net 2.0.0.480, 2011.12.11)
我让 protobuf.net 将无效(随机)字节反序列化为 KeyValuePair(即不可为空)。不是(如预期的那样)抛出异常,而是返回了一个空结构。
由于此默认结构可能是有效数据,因此我看不到判断源数据是否实际有效的方法。这是一个错误,还是我错过了一种方法?
(protobuf-net 2.0.0.480, 2011.12.11)
更新:
在 v2 中的某些情况下,它不会发现这一点,而是会终止,就好像它已经到达流的末尾 - 特别是如果“字段编号”在应用移位之后是非正数时。但是,这在 protobuf 流中无效,这将在下一次构建中修复。
这取决于它的随机性;p 实际上,让它在不引发错误的情况下做任何事情是非常令人印象深刻的——protobuf 规范对布局非常具体,通常它会在那里抛出一个很大的异常(可能提到“意外的线-类型”或类似)。
强调:几乎在所有情况下它都会抛出异常。如果您对正确规范的某些数据进行了侥幸,但字段编号不同,那么它将默默地忽略意外数据,您将获得一个全零的结构。如果您侥幸获得正确规范的一些数据,但使用正确的字段编号和布局,您将得到垃圾。但这就像说
如果我随机生成碰巧碰巧的数据,请
{"foo":"0"}
不要JavascriptSerializer
抱怨!!!漏洞!!!
你确定你真的在这里反序列化了一些数据吗?并且流还不是EOF位置?例如,以下内容不会出错,因为您没有倒带流 - 您正在有效地反序列化零字节:
var ms = new MemoryStream();
ms.Write(randomBytes, 0, randomBytes.Length);
var obj = Serializer.Deserialize<Foo>(ms);
(零字节对于 protobuf 对象是完全有效的)
如果您想测试流的有效性,您可以使用ProtoReader
, 只是跳过(SkipField()
或类似的东西)每个字段,直到ReadNextHeader()
(或其他)返回一个非正整数。