MST

星途 面试题库

面试题:Java反序列化安全策略实施之基础认知

请简述在Java中实施反序列化安全策略时,如何通过白名单机制来防止恶意类的反序列化?给出具体实现思路和关键代码片段。
45.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义白名单:确定允许反序列化的类,并将它们列入白名单。
  2. 自定义ObjectInputStream:继承ObjectInputStream并重写resolveClass方法,在该方法中检查要反序列化的类是否在白名单内。

关键代码片段

import java.io.*;
import java.util.HashSet;
import java.util.Set;

public class SecureObjectInputStream extends ObjectInputStream {

    // 定义白名单
    private static final Set<String> WHITELIST = new HashSet<>();
    static {
        WHITELIST.add("com.example.YourAllowedClass1");
        WHITELIST.add("com.example.YourAllowedClass2");
    }

    public SecureObjectInputStream(InputStream in) throws IOException {
        super(in);
    }

    @Override
    protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
        String className = desc.getName();
        if (!WHITELIST.contains(className)) {
            throw new InvalidClassException("Unauthorized deserialization attempt for class: " + className);
        }
        return super.resolveClass(desc);
    }
}

在反序列化时使用自定义的SecureObjectInputStream

try (SecureObjectInputStream ois = new SecureObjectInputStream(new FileInputStream("serializedFile"))) {
    Object obj = ois.readObject();
    // 处理反序列化后的对象
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}