前言
往期内容回顾
0x01 概述
0x02 序列化详解
import java.io.*;
class User implements Serializable{
private String name;
public User(String name) {
this.name = name;
}
// 方便打印查看类的信息
@Override
public String toString() {
return "User{name=" + name + '}';
}
}
public class Demo1 {
public static void main(String[] args) throws Exception {
User user = new User("zhangsan");
String filename = "user.ser";
serialize(filename, user); // 把对象序列化保存到文件
User user1 = (User) unserialize(filename); // 从文件反序列化对象
System.out.println(user1);
}
// 序列化对象并保存到文件
public static void serialize(String filename, Object obj) throws Exception{
// 创建一个FIleOutputStream
FileOutputStream fos = new FileOutputStream(filename);
// 将这个FIleOutputStream封装到ObjectOutputStream中
ObjectOutputStream os = new ObjectOutputStream(fos);
// 调用writeObject方法,序列化对象到文件user.ser中
os.writeObject(obj);
}
// 从文件反序列化对象
public static Object unserialize(String filename) throws Exception{
// 创建一个FIleInutputStream
FileInputStream fis = new FileInputStream(filename);
// 将FileInputStream封装到ObjectInputStream中
ObjectInputStream oi = new ObjectInputStream(fis);
// 调用readObject从user.ser中反序列化出对象,还需要进行一下类型转换,默认是Object类型
return oi.readObject();
}
}
1) 类对象序列化之后不一定要保存成文件,也可以通过ByteArrayOutputStream保存为字节数组。
2) 反序列化之后返回的数据类型为Object类型,如果要转化为序列化之前的类,需要进行强制类型转化。
0x03 反序列化漏洞
0x04 JAVA与PHP反序列化对比
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0x05 结论
原文始发于微信公众号(Beacon Tower Lab):告别脚本小子系列丨JAVA安全(5)——序列化与反序列化
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论