如何使用Java 9 ObjectInputFilter大小限制?

Car*_*own 6 java deserialization java-9

Java 9增加了一些反序列化安全措施ObjectInputStreams,除了类的白名单/黑名单等更广泛使用的措施外,还增加了一些大小限制:arrayLength\xe2\x80\x8b、depth\xe2\x80\x8b references\xe2\x80\x8b、、streamBytes\xe2\x80\x8b

\n\n

数组长度和深度很简单,但是如何正确使用呢references?文档说:The current number of object references,但是这些引用存储在哪里?它不是当前输入流中的引用数。如果我通过流发送一次性使用实例并且不再需要它,我预计该数字会再次下降,至少在垃圾收集时是这样。我意识到 ObjectStreams 维护一个HandleTable,默认情况下存储实例及其引用,但即使通过使用来规避这一点,readUnshared/writeUnshared问题仍然存在。从我的测试来看,我从未见过引用计数下降(同样适用于streamBytes)。

\n\n

如果这个数字真的永远不会下降,您将如何处理连续发送数据的应用程序?即使您能够发送所有内容unshared以便可以跟踪对象何时完成,您将如何确定streamBytes该对象的 ?

\n\n

例子:

\n\n
ObjectInputStream in; // e.g. get from a socket\nin.setObjectInputFilter(new ObjectInputFilter() {\n    public Status checkInput(FilterInfo fi) {\n        if (fi.references() > 1000) return Status.REJECTED;\n        return Status.UNDECIDED;\n    }\n});\n
Run Code Online (Sandbox Code Playgroud)\n

Tom*_*ine 0

正如问题中所指出的,维护对读取对象的引用(通过、 通过合适或类似ObjectInputStream的对象除外)。流中迄今为止未读取的数据可能具有对这些对象中任何一个的反向引用(即使不存在其他引用,也是如此)。readUnsharedserialPersistentFieldsWeakReference

没有重置的连续流对象泄漏。

我想这个选项正在尝试缓解的是使用少量数据创建大量对象的流,尽管我猜测数据大小和对象数量之间存在合理的线性因子(除非发生特殊情况)在)。