184.5.3. 如何启用 polymorphic 对象映射

polymorphic 对象映射是通过在 serialized 阵列中提供额外的元数据来序列化和反序列化数组的机制,它标识阵列中的对象类型。

重要

polymorphic 对象映射会带来一个固有安全风险,因为该机制允许 发件人 选择哪个类实例化,从而由发送者形成攻击基础。红帽的 FasterXML Jackson 库的发布是一个白名单机制,它提供了针对这个威胁的额外级别保护。您必须确保您使用红帽的 jackson-databind 库的发布(由 Fuse 版本 7.7 及更新版本提供),以获得这个额外的保护层。如需了解更多详细信息,请参阅 第 184.5.5 节 “来自多形反序列化的安全风险”

要使接收器可以在阵列中对对象进行反序列化处理,需要在序列化数据中提供类型元数据。默认情况下,Jackson 不会对序列化对象的任何类型元数据进行编码,因此您需要编写一些附加代码才能启用此功能。

要启用多形对象映射,请执行以下步骤(使用 ListOfShape 作为示例):

  1. 对于可以作为列表元素的每一个类( Shape的子类),使用 @JsonTypeInfo 注解类,如下所示:

    @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY)
    public class Triangle extends Shape {
      ...
    }
  2. Triangle 类被序列化为 JSON 格式时,它的格式如下:

    {"@class":"com.example.Triangle", "property1":"value1", "property2":"value2", ...}
  3. 必须通过将这些类添加到反序列化白名单中,将接收器配置为允许反序列化、Square 及其他形式类。要配置白名单,将 jackson.deserialization.whitelist.packages system 属性设置为用逗号分开的类和软件包列表。例如,要允许反序列化 TriangleSquare 类,将系统属性设置为如下:

    -Djackson.deserialization.whitelist.packages=com.example.Triangle,com.example.Square

    或者,您可以设置系统属性以允许整个 com.example 软件包:

    -Djackson.deserialization.whitelist.packages=com.example
    注意

    这个白名单机制只可用于 Red Hat 的 jackson-databind 库的发布。标准 jackson-databind 库使用黑名单机制,当发现潜在的危险新 gadget 类时,都需要更新它。