《Java安全编码标准》一1.6 序列化

简介: 本节书摘来自华章出版社《Java安全编码标准》一书中的第1章,第1.6节,作者 (美)Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.6 序列化

序列化使得Java程序中对象的状态能被抓取并写入到字节流中[Sun 2004b]。这使得该对象的状态能够保存下来,所以可以在未来需要的时候恢复(通过反序列化)。序列化可以通过网络使用RMI的方式调用Java方法,这些对象被编组(序列化),在分布部署的虚拟机之间进行交换,然后进行解组(反序列化)。序列化还广泛使用在Java Beans中。
可以用以下方式序列化对象:

ObjectOutputStream oos = new ObjectOutputStream(
  new FileOutputStream("SerialOutput"));
oos.writeObject(someObject);
oos.flush();

可以用以下的方式反序列化对象:

ObjectInputStream ois = new ObjectInputStream(
  new FileInputStream("SerialOutput"));
someObject = (SomeClass) ois.readObject();

序列化能够捕捉对象中的所有非暂态字段,包括那些正常情况下不能读取的非公有字段,这通过object类的Serializable接口来实现。序列化的值写入字节流之后,如果字节流是可读的,那么原先那些正常情况下不能访问的字段的值也就可以通过推导得出。此外访问,当反序列化一个类时,原来保存的值可能会被修改或者伪造。
引进一个安全管理器并不能防止正常情况下无法访问的字段被序列化和反序列化(如果字节流需要被存储或发送,那么必须给予它从文件或网络进行读写的权限)。网络流量(包括RMI)可以得到保护,但是,这需要使用SSL/TLS协议。
在序列化和反序列化对象时需要进行特殊处理的类可以实现有以下签名的方法[API 2006]:

private void writeObject(java.io.ObjectOutputStream out)
 throws IOException;
private void readObject(java.io.ObjectInputStream in)
 throws IOException, ClassNotFoundException;

如果一个Serializable类没有重写writeObject()方法的实现,这个对象会使用默认的方法来完成序列化,它会序列化所有的public、protected、package-private,以及private字段,除了transient字段。同样,当Serializable类没有重写readObject()方法的实现时,这个对象会反序列化所有的public、protected,以及private字段,除了那些transient字段。这个问题会在规则SER01-J中深入探讨。

相关文章
|
2月前
|
存储 Java 数据库
|
8天前
|
存储 Java 测试技术
滚雪球学Java(22):序列化和反序列化
【4月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
24 1
滚雪球学Java(22):序列化和反序列化
|
11天前
|
SQL 存储 安全
每日一道面试题:Java中序列化与反序列化
每日一道面试题:Java中序列化与反序列化
10 0
|
18天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
16 1
|
20天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
21天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
26 5
|
22天前
|
安全 算法 Java
安全无忧:Java并发集合容器的应用与实践
安全无忧:Java并发集合容器的应用与实践
28 0
安全无忧:Java并发集合容器的应用与实践
|
26天前
|
存储 Java Maven
java序列化
java序列化
|
2月前
|
存储 安全 Java
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
40 0
|
2月前
|
存储 缓存 JSON
什么是Java序列化,它有哪些重要性
什么是Java序列化,它有哪些重要性