【发布时间】:2021-01-07 23:29:37
【问题描述】:
我正在使用 JMS ObjectMessage 和 ActiveMQ 在其 setObject() 函数中传输可序列化的 POJO。
在我的客户端上:
ObjectMessage omsg = getSession().createObjectMessage();
omsg.setObject(objectToSend);
objectToSend 是一个包含 Map 的 POJO:
private Map<Integer, Double> tickIdToPrice;
在我的服务器上我尝试解码:
if (omsg.getObject() instanceof AJavaClass) {
但这会导致Exception:
java.lang.ClassCastException: cannot assign instance of java.util.CollSer
to field com.x.z.y.RequestPriceResult.tickIdToPrice of type
java.util.Map in instance of com.x.z.y.RequestPriceResult
有人知道是什么导致了这个异常吗?关于CollSer 的信息很少。
【问题讨论】:
-
如果可能的话,我会劝阻你不要使用
ObjectMessage。ObjectMessage依赖于 Java 序列化来(取消)编组通常被认为不安全的有效负载,因为恶意有效负载可以利用主机系统。 Lots of CVEs 已为此创建。还有许多其他与安全无关的问题,您应该read about。这篇文章对如何使用JSON等替换ObjectMessage有很好的建议 -
除了
ObjectMessage的架构和安全问题之外,值得注意的是Java 序列化也慢。 -
干杯@JustinBertram,SERIALIZABLE_PACKAGES 设置不能解决大多数序列化安全问题吗?我目前正在使用 DTO 作为 objectmessage,并且仍然非常喜欢 java 序列化的易用性。随着项目变得更加成熟,我可能会转向 protobuff 作为有效载荷。
-
将允许反序列化的包列入白名单有助于减少安全问题,但不一定能消除这些问题。而且你仍然有性能和架构问题。 ActiveMQ 5.x 和ActiveMQ Artemis 都是多协议代理。通过使用
ObjectMessage,您将客户端锁定到Java 和JMS。例如,您不能使用 Python 的 STOMP 或 JavaScript 或 C# 的 AMQP。也许您现在不需要这种灵活性,但将来可能会。现在在没有明确的显着好处的情况下限制自己似乎是不明智的。
标签: java activemq spring-messaging