网站首页 > java教程 正文
java序列化算法透析
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。
序列化的必要性
Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。
这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生
如何进行序列化
public class Java_Test {
public static void main(String args[]) throws Exception {
Peoper peoper = new Peoper();
// peoper1.setAge(6);
peoper.setName("zy");
//peoper1.setJob("6666666666");
// 将序列化对象写入文件object.txt中
FileOutputStream fos = new FileOutputStream("object.ser");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(peoper);
os.close();
// 从文件object.txt中读取数据
FileInputStream fis = new FileInputStream("object.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
//MyObjectInputStream ois = new MyObjectInputStream(fis);
//ObjectInputStream ois = new ObjectInputStream(fis);
// 通过反序列化恢复对象obj
Peoper peoper1 = (Peoper) ois.readObject();
System.out.println(peoper1);
ois.close();
}
}
序列化漏洞发生的位置
在反序列化的过程中,我们通过ObjectInputStream来进行字节码的读取,但是在该类中没有对将要序列化的对象进行校验。攻击者则可以通过构造POC的方式,把自己构造的对象提交到服务器,服务器在反序列化的工程中会执行readObject方法,而此方法可以在构造的对象中重写。
通过改变transferedMap的key或则value值来触发transferChain的系统函数的执行,从而控制服务器,造成严重的损失。
解决方案原理核心
通过重写ObjectInputStream的resolveClass方法对即将序列化的对象进行校验(在反序列化之前进行),从而达到避免反序列化漏洞的风险。
解决方法具体代码如下
public class MyObjectInputStream extends ObjectInputStream {
public MyObjectInputStream(InputStream in) throws IOException {
super(in);
}
protected MyObjectInputStream() throws IOException, SecurityException {
}
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
if (desc == null) {
return super.resolveClass(desc);
}
if (!desc.getName().equals(Peoper.class.getName())) {
throw new InvalidClassException("不能序列化,可能有攻击",desc.getName());
}
return super.resolveClass(desc);
}
}
在实际开发过程中代码示例
public class MyObjectInputStream extends ObjectInputStream {
public MyObjectInputStream(InputStream in) throws IOException {
super(in);
}
protected MyObjectInputStream() throws IOException, SecurityException {
}
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
if (desc == null) {
return super.resolveClass(desc);
}
if (!desc.getName().contains("被序列化对象包名")) {
throw new InvalidClassException("不能序列化,可能有攻击",desc.getName());
}
return super.resolveClass(desc);
}
}
以上是个人处理方式以及见解,如有不妥之处,希望之处!!!!
猜你喜欢
- 2024-11-04 快速处理Kafka反序列化错误(kafka自定义反序列化)
- 2024-11-04 又一个反序列化漏洞,我服了...(反序列化漏洞修复方案)
- 2024-11-04 Java代码示例:如何使用 serialVersionUID处理序列化
- 2024-11-04 Java 序列化机制(java序列化过程)
- 2024-11-04 SpringBoot整合Grpc实现跨语言RPC通讯
- 2024-11-04 php和java及python3.10的序列化和反序列化
- 2024-11-04 Java修炼终极指南:133 避免在反序列化时发生DoS攻击
- 2024-11-04 聊聊fastjson反序列化的那些坑(fastjson反序列化原理)
- 2024-11-04 Java序列化 3 连问,这太难了吧(在线序列化工具)
- 2024-11-04 避免使用Java序列化(serializable 防止序列化)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)