单例模式中反射漏洞和反序列化漏洞的示例分析
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章给大家分享的是有关单例模式中反射漏洞和反序列化漏洞的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。除了枚举式单例模式外,其余4种在单例模式提到的单例模式的实
千家信息网最后更新 2025年11月16日单例模式中反射漏洞和反序列化漏洞的示例分析
这篇文章给大家分享的是有关单例模式中反射漏洞和反序列化漏洞的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
除了枚举式单例模式外,其余4种在单例模式提到的单例模式的实现方式都存在反射漏洞和反序列化漏洞。
package singleton;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Constructor;/** * 用反射和反序列化的方法破解单例模式 * @author weiyx15 * */public class SingletonCrack { public static void main(String[] args) throws Exception { // 正常创建单例对象 SingletonLazy s1 = SingletonLazy.getInstance(); SingletonLazy s2 = SingletonLazy.getInstance(); System.out.println(s1); System.out.println(s2); // 用反射破解单例 Class cls = (Class) Class.forName("singleton.SingletonLazy"); // 获取SingletonLazy类 Constructor cons = cls.getDeclaredConstructor(null); // 获取SingletonLazy的构造方法 cons.setAccessible(true); // 跳过方法的可见性检查 SingletonLazy s3 = cons.newInstance(); // 调用构造方法生成新对象 SingletonLazy s4 = cons.newInstance(); // 调用构造方法生成新对象 System.out.println(s3); System.out.println(s4); // 用反序列化破解单例 FileOutputStream fos = new FileOutputStream("object.out"); // 文件输出流 ObjectOutputStream oos = new ObjectOutputStream(fos); // 对象输出流 oos.writeObject(s1); // 向文件序列化对象 oos.close(); // 关闭对象输出流 fos.close(); // 关闭文件输出流 FileInputStream fis = new FileInputStream("object.out"); // 文件输入流 ObjectInputStream ois = new ObjectInputStream(fis); // 对象输入流 SingletonLazy s5 = (SingletonLazy) ois.readObject(); // 从文件反序列化对象 ois.close(); // 关闭对象输入流 fis.close(); // 关闭文件输入流 System.out.println(s5); }} 运行结果
singleton.SingletonLazy@15db9742 // s1
singleton.SingletonLazy@15db9742// s2
singleton.SingletonLazy@6d06d69c// s3
singleton.SingletonLazy@7852e922// s4
singleton.SingletonLazy@3b07d329 // s5
从运行结果可以看到,通过反射可以得到私有构造方法,从而实例化两个不同的对象实例 codesingleton.SingletonLazy@6d06d69c}和{@code singleton.SingletonLazy@7852e922}. 通过反序列化,也可以得到新对象{@code singleton.SingletonLazy@3b07d329}.
以懒汉式单例模式的实现为例,解决反射漏洞和反序列化漏洞的方法如下:
package singleton;import java.io.ObjectStreamException;import java.io.Serializable;/** * 排除了反射漏洞和反序列化漏洞的懒汉式单例模式 * @author weiyx15 * */public class SingletonLazySafe implements Serializable{ private static SingletonLazySafe instance; private SingletonLazySafe() { // 防止反射漏洞通过再次调用私有构造方法实例化新的instance if (instance != null) { throw new RuntimeException(); // 抛出运行时异常 } } public static synchronized SingletonLazySafe getInstance() { if (instance == null) // 如果未实例化,则先实例化 { instance = new SingletonLazySafe(); // 调用getInstance方法后再实例化对象 } return instance; } /** * 从I/O流读取对象时会调用readResolve接口 * 在readResolve接口中直接返回instance对象 * 避免反序列化时重新实例化对象 * @return 单例对象 * @throws ObjectStreamException */ private Object readResolve() throws ObjectStreamException { return instance; }}感谢各位的阅读!关于"单例模式中反射漏洞和反序列化漏洞的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
对象
序列
漏洞
反射
方法
模式
实例
文件
输入
输出
示例
分析
内容
懒汉
接口
更多
篇文章
结果
生成
私有
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发各岗位
云南网络安全宣传周在线
我的世界载具服务器
什么是保护数据库安全的有效措施
新乡市聚弘网络技术公司
软件开发公司商业计划书范文
网络服务器忙指什么
阿里云服务器免费
BMC界面获取服务器bmc日志
连接代理服务器
火车站免费网络安全吗
软件开发包含技术服务吗
客户端通过什么向服务器发送指令
传统数据库转大数据
华为网络技术部门和研发部门
全球网络安全hcc大会
数据库如何从视图中查询信息
聊大中文期刊全文数据库
网络安全信息资产登记表
温州软件开发驻场怎么样
常州公司网络安全准入控制哪家好
查询数据库的时序图
数据库汇总啥意思
网络安全与文化市场执法
人员信息数据库及表实例
数据库组件化
数据库原理与应用教程第四版慕课
数据库datepart
提取数据库数据的管理制度
肇庆通讯软件开发销售厂