1

我需要解析不受信任的 Java 序列化对象。数据以字节数组的形式提供给我(在某个时候由 ObjectOutputStream 写入)。

不想简单地调用 ObjectInputStream.readObject() 和/或加载实际对象。我正在寻找一种安全解析字节并获取字段名称和值的方法。

--

在查看了用于反序列化对象的ObjectInputStream 过程之后,这是我迄今为止的尝试的一个小总结。

我试图根据预期的流常量递归地提取字段类型/名称(作为 unicode 字符串)。我最终得到一个字段名称列表,其值应按顺序出现在字节数组中。我对这种方法感到不安,因为它可能有问题。特别是适应似乎是单独的序列化协议,然后是 HashMap、ArrayList 等。但如果我能找到一种方法来读取表示字段值的字节,它可能会起作用:

我可以尝试根据大小/偏移量读取和存储原语,但是当我遇到我的第一个对象时,它变得有点复杂——没有明确的方法来区分哪些字节与哪些值相关联(没有实际加载以 ObjectInputStream 可能的方式的对象?)。

--

任何人都可以建议一个我显然已经过去的潜在解决方案,或者一个可以帮助解析序列化数据而不加载对象的可信库吗?

感谢您的阅读,以及所有的意见/建议!!!如果有不清楚的地方,我深表歉意,如果您能容忍我,我很乐意澄清。

4

1 回答 1

2

原则上你不能这样做。任何 Java 类都可以通过仅在反序列化期间调用的代码接管其自己的序列化并将任意数据写入只有它知道如何解析和重构的流。

于 2016-07-06T20:57:52.907 回答