Java 9增加了一些反序列化安全措施ObjectInputStreams,除了类的白名单/黑名单等更广泛使用的措施外,还增加了一些大小限制:arrayLength\xe2\x80\x8b、depth\xe2\x80\x8b references\xe2\x80\x8b、、streamBytes\xe2\x80\x8b。
数组长度和深度很简单,但是如何正确使用呢references?文档说:The current number of object references,但是这些引用存储在哪里?它不是当前输入流中的引用数。如果我通过流发送一次性使用实例并且不再需要它,我预计该数字会再次下降,至少在垃圾收集时是这样。我意识到 ObjectStreams 维护一个HandleTable,默认情况下存储实例及其引用,但即使通过使用来规避这一点,readUnshared/writeUnshared问题仍然存在。从我的测试来看,我从未见过引用计数下降(同样适用于streamBytes)。
如果这个数字真的永远不会下降,您将如何处理连续发送数据的应用程序?即使您能够发送所有内容unshared以便可以跟踪对象何时完成,您将如何确定streamBytes该对象的 ?
例子:
\n\nObjectInputStream 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});\nRun Code Online (Sandbox Code Playgroud)\n