对非静态内部类的序列化依赖编译器,且随着平台的不同而不同,容易产生错误。
对内部类的序列化会导致外部类的实例也被序列化。这样有可能泄露敏感数据。
public class DistributeData implements SerializedName{
public class CodeDetail {...}
}
CodeDetail 并不会被序列化。
public class DistributeData implements SerializedName{
public class CodeDetail implements SerializedName{...}
}
报NotSerializableException,查错误, CodeDetail 这个类虽然实现了 Serializable 接口,但
CodeDetail 在项目中是以内部类的形式定义的。
public class DistributeData implements SerializedName{
public static class CodeDetail implements SerializedName{...}
}
上面的这种形式可以被序列化但是容易造成敏感信息泄露。
审计策略
人工查找 implements Serializable 的所有内部类
修复方案
class ${InnerSer} {}
去除内部类的序列化。
static class ${InnerSer} implements Serializable {}
把内部类声明为静态从而被序列化。但是要注意遵循示例三中的敏感信息问题