Java序列化的状态( 三 )

其他大部分与序列号有关的安全研究 都是基于Chris Frohoff、Gabriel Lawrence和Alvaro Munoz的工作成果 。

序列化在哪里?如何知道我的应用程序是否用到了序列化?

要移除序列化 , 需要从java.io包开始 , 这个包是java.base模块的一部分 。 最常见的使用场景是:

实现Serializable接口和(可选)serialversionuid长整型字段 。

使用ObjectInputStream或ObjectOutputStream 。

使用 严重依赖序列化 的库 , 例如:Xstream、Kryo、BlazeDS和 大多数应用程序服务器 。

使用这些方法的开发人员应考虑使用其他存储和读回数据的替代方法 。 Eishay Smith发布了 几个不同序列化库的性能指标 。 在评估性能时 , 需要在基准度量指标中包含安全方面的考虑 。 默认的Java序列化“更快”一些 , 但漏洞也会以同样的速度找上门来 。

我们该如何降低序列化缺陷的影响?

项目Amber 包含了一个关于将序列化API隔离出来的讨论 。 我们的想法是将序列化从java.base移动到单独的模块 , 这样应用程序就可以完全移除它 。 在确定JDK 11功能集 时并没有针对该提议得出任何结果 , 但可能会在未来的Java版本中继续进行讨论 。

推荐阅读