我们正在尝试实现安全的应用程序框架,并且为了避免在反序列化之前拒绝服务攻击,我们希望实现反序列化的对象数量,并在超过阈值时中止反序列化。
为满足上述要求,谷歌搜索了一些论坛,并发现有一些方法可以用于java序列化,即
resolveClass(ObjectStreamClass desc)
resolveObject(Object obj)
但我没有得到关于这两种方法的任何文档或示例。可以有人发布我或提供一些有关这些方法/自定义反序列化的简要信息
答案 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);
}
}