模块  java.base
软件包  java.io

Interface ObjectInputFilter

  • Functional Interface:
    这是一个功能接口,因此可以用作lambda表达式或方法引用的赋值目标。

    @FunctionalInterfacepublic interface ObjectInputFilter
    在反序列化期间过滤类,数组长度和图表度量。

    警告:不受信任数据的反序列化本质上是危险的,应该避免。 应根据Secure Coding Guidelines for Java SE的“序列化和反序列化”部分仔细验证不受信任的数据。 Serialization Filtering描述了防御性使用串行过滤器的最佳实践。

    如果在ObjectInputStream上设置,则调用checkInput(FilterInfo)方法以验证类,每个数组的长度,从流中读取的对象数,图的深度以及从流中读取的总字节数。

    可以通过setObjectInputFilter为单个ObjectInputStream设置过滤器。 可以通过Config.setSerialFilter设置过滤器,以影响无法设置过滤器的每个ObjectInputStream

    过滤器确定参数是ALLOWED还是REJECTED并应返回相应的状态。 如果过滤器无法确定状态,则应返回UNDECIDED 应根据特定用例和预期类型设计过滤器。 为特定用途设计的过滤器可以传递给过滤器范围之外的类。 如果过滤器的目的是列出黑名单,那么它可以拒绝匹配的候选类,并为其他人报告UNDECIDED。 可以用类被称为过滤等于nullarrayLength等于-1,深度,引用的数量,以及流大小,并返回反映只有一个或只有一些值的状态。 这允许过滤器具体说明其报告的选择并使用其他过滤器而不强制允许或拒绝状态。

    通常,自定义筛选器应检查是否配置了流程范围的筛选器,如果是,则将其推迟。 例如,

       ObjectInputFilter.Status checkInput(FilterInfo info) { ObjectInputFilter serialFilter = ObjectInputFilter.Config.getSerialFilter(); if (serialFilter != null) { ObjectInputFilter.Status status = serialFilter.checkInput(info); if (status != ObjectInputFilter.Status.UNDECIDED) { // The process-wide filter overrides this filter return status; } } if (info.serialClass() != null && Remote.class.isAssignableFrom(info.serialClass())) { return Status.REJECTED; // Do not allow Remote objects } return Status.UNDECIDED; }  

    除非另有说明,否则将null参数传递给此接口中的方法及其嵌套类将导致抛出NullPointerException

    从以下版本开始:
    9
    另请参见:
    ObjectInputStream.setObjectInputFilter(ObjectInputFilter)