184.5.3. polymorphic 개체 매핑을 활성화하는 방법
polymorphic 개체 매핑은 배열의 개체 유형을 식별하는 직렬화된 배열에 추가 메타데이터를 제공하여 추상 클래스의 serialize 및 deserialize 배열을 수행할 수 있는 메커니즘입니다.
polymorphic 개체 매핑은 발신자가 발신자 가 공격의 기초를 형성할 수 있는 클래스를 인스턴스화할 수 있기 때문에 본질적으로 보안 위험을 초래합니다. Red Hat은 FasterXML Jackson 라이브러리를 배포함으로써 이러한 위협에 대한 추가 수준의 보호 기능을 제공합니다. 이러한 추가 보호 계층을 얻으려면 Red Hat의 jackson-databind 라이브러리( Fuse 버전 7.7 이상에서 제공)를 사용하고 있는지 확인해야 합니다. 자세한 내용은 184.5.5절. “polymorphic deserialization의 보안 위험” 에서 참조하십시오.
수신자가 배열의 개체를 역직렬화할 수 있도록 하려면 직렬화된 데이터에 형식 메타데이터를 제공해야 합니다. 기본적으로 Jackson은 직렬화된 오브젝트에 대한 유형 메타데이터를 인코딩하지 않으므로 이 기능을 사용하려면 추가 코드를 작성해야 합니다.
polymorphic 개체 매핑을 활성화하려면 다음 단계를 수행하십시오(예로서 ListOfShape
사용).
목록의 요소일 수 있는 각 클래스마다 다음과 같이
@JsonTypeInfo
로 클래스에 주석을 답니다.@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY) public class Triangle extends Shape { ... }
Triangle
클래스가 JSON 형식으로 직렬화되면 다음과 같은 형식이 있습니다.{"@class":"com.example.Triangle", "property1":"value1", "property2":"value2", ...}
수신자는 deserialization whitelist에 이러한 클래스를 추가하여
Triangle
, square
및 기타 모양 클래스를 역직렬화할 수 있도록 구성해야 합니다. 화이트리스트를 구성하려면jackson.deserialization.whitelist.packages
시스템 속성을 쉼표로 구분된 클래스 및 패키지 목록으로 설정합니다. 예를 들어Triangle
, square 클래스의 deserialization을 허용하려면 다음과 같이 시스템 속성을 설정합니다.For example, to allow deserialization of the Triangle , square
classes, set the system property as follows:-Djackson.deserialization.whitelist.packages=com.example.Triangle,com.example.Square
또는 전체
com.example
패키지를 허용하도록 system 속성을 설정할 수 있습니다.-Djackson.deserialization.whitelist.packages=com.example
참고이 허용 목록 메커니즘은 jackson-databind 라이브러리의 Red Hat 배포에서만 사용할 수 있습니다. 표준 jackson-databind 라이브러리는 블랙리스트 메커니즘을 사용하며 잠재적으로 위험한 새 가젯 클래스가 검색될 때마다 업데이트해야 합니다.