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

时间:2017-01-08 06:36:29

标签: java serialization deserialization

我们正在尝试实现安全的应用程序框架,并且为了避免在反序列化之前拒绝服务攻击,我们希望实现反序列化的对象数量,并在超过阈值时中止反序列化。

为满足上述要求,谷歌搜索了一些论坛,并发现有一些方法可以用于java序列化,即

resolveClass(ObjectStreamClass desc)
resolveObject(Object obj)

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

1 个答案:

答案 0 :(得分:1)

您要查找的两种方法都在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);
    }
}