单例模式如何应对反射攻击
java
it书童
2020-12-26 22:25:02
0赞
0踩
100阅读
0评论
public class HungrySingleton implements Serializable {
private final static HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return hungrySingleton;
}
private Object readResolve() {
return hungrySingleton;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<HungrySingleton> objectClass = HungrySingleton.class;
Constructor<HungrySingleton> constructor = objectClass.getDeclaredConstructor();
// 通过反射,将权限打开
constructor.setAccessible(true);
HungrySingleton instance = HungrySingleton.getInstance();
HungrySingleton newInstance = constructor.newInstance();
System.out.println(instance);
System.out.println(newInstance);
System.out.println(instance == newInstance);
}
}
结果:
design.pattern.creational.singleton.HungrySingleton@610455d6
design.pattern.creational.singleton.HungrySingleton@511d50c0
false
对于饿汉式单例模式的防御
private HungrySingleton() {
if (hungrySingleton != null) {
throw new RuntimeException("单例构造器禁止反射调用");
}
}
这种防御方式仅对于类加载时就生成实例的单例模式有效
对于懒汉式单例模式是不起作用的,哪怕使用了再复杂的逻辑,反射也能直接暴力修改程序预设的判断,就是这么粗暴与牛逼,完全不讲武德
具体原理可通过断点调试得知
- 上一篇: 序列化破坏单例模式原理解析
- 下一篇: 枚举实现单例模式

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/1013
精品付费
个人开发者通过payjs接入微信支付
2584
0
这一次,真正掌握composer
1509
0
相关推荐
java Request 对象详解
303
0
java 流程控制语句
139
0
Java 实现 TCP 通信程序
170
0
Mybatis 二级缓存
151
0
spring DI 构造函数注入方式
193
0
spring DI set方法注入方式
162
0
spring 使用事务实现转账小案例
149
0
什么是Hystrix
180
0
ssm 框架整合
132
0
Thread的start与run方法的区别
108
0
java的字节流和字符流
136
0
线程池-治理线程的最大法宝
49
0
CAS-不可中断的典范
56
0
spring 文档都不读,就想读懂源码?
46
0