java - 如何在反序列化之前验证对象流的内容?

标签 java serialization deserialization

我们正在尝试实现安全的应用程序框架,作为避免反序列化之前拒绝服务攻击的一部分,我们希望了解有多少对象正在被反序列化,并在超过阈值时中止反序列化。

为了满足上述要求,谷歌搜索了一些论坛,并了解到有一些与java序列化相关的方法,即

resolveClass(ObjectStreamClass desc)
resolveObject(Object obj)

但是我没有得到有关这两种方法的任何文档或示例。有人可以发邮件给我或提供一些有关这些方法/自定义反序列化的简要信息

最佳答案

您要查找的两种方法都在 java.io.ObjectInputStream 类 ( link ) 中。 IBM 有一篇很好的文章解释了前瞻性 Java 反序列化 here 。基本上,您可以子类 java.io.ObjectInputStream 并重写 resolveClass() 方法来验证您要反序列化的类是您期望的类,如下所示:

public class LookAheadObjectInputStream extends ObjectInputStream {

    public LookAheadObjectInputStream(InputStream inputStream)
            throws IOException {
        super(inputStream);
    }

    /**
     * Only deserialize instances of our expected Bicycle class
     */
    @Override
    protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException,
            ClassNotFoundException {
        if (!desc.getName().equals(Bicycle.class.getName())) {
            throw new InvalidClassException(
                    "Unauthorized deserialization attempt",
                    desc.getName());
        }
        return super.resolveClass(desc);
    }
}

关于java - 如何在反序列化之前验证对象流的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41530173/

相关文章:

java - 为什么传输对象需要实现Serializable?

java - Jackson:仅序列化给定类的给定实例变量

c++ - 我可以将 FlatBuffers 序列化/反序列化为 JSON 吗?

java - 当 List 包含非字母数字字符时,什么决定 Collections.sort 中的排序顺序?

java - 如何在 Java 中创建哈希表?

java - Jenkins 文件路径作为参数

java - 使用Hadoop库序列化Java对象

scala - 使用 Scala 应用程序将 List[Object] 转换为案例类

c++ - ECS序列化

java - 如何使用带有 Java 的 Selenium webdriver 为 firefox 设置代理?