单例模式中反射漏洞和反序列化漏洞的示例分析
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章给大家分享的是有关单例模式中反射漏洞和反序列化漏洞的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。除了枚举式单例模式外,其余4种在单例模式提到的单例模式的实
千家信息网最后更新 2025年01月18日单例模式中反射漏洞和反序列化漏洞的示例分析
这篇文章给大家分享的是有关单例模式中反射漏洞和反序列化漏洞的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
除了枚举式单例模式外,其余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); // 用反射破解单例 Classcls = (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安全错误
数据库的锁怎样保障安全
mysql的数据库关系图
服务器机房用电功率估算
网络安全防护技术加密技术
pc往服务器传输文件
计算机与网络技术毕业论文选题
上海市网络安全防护技能
初中网络安全演讲
武汉定制化国产服务器供应费用
微信小程序与网络安全
暗黑破坏神3服务器一直闪退
网络安全公司需要多少钱
软件开发画图所需的工具
四川网络安全岗位招聘
网络安全家庭教育读后感
网络技术的了解
倩女幽魂手游哪个服务器多
名企c软件开发面试
重庆科技学院软件开发
怎样加强网络安全心得体会
数据库如何将两个表并
无锡市盾网软件开发有限公司
txt无法写入数据库
2008数据库如何连接
网络技术主要涉及哪三个网络
谷歌云服务器注册
网络安全源头的意识
做软件开发的男生是it男吗
温州招软件开发工程师
cad软件开发什么意思啊
网络安全风险监测app有哪些