【java_设计模式】单例模式 反序列化攻击

学习路径:https://coding.imooc.com/class/270.html

  • 前言
    无论是【懒汉式】还是【饿汉式】的单例模式,不加以处理,都可以使用序列化和反序列化攻击。

  • 攻击代码

  		HungrySingleton instance = HungrySingleton.getInstance();
  		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton_file"));
  		// 序列化【写】操作
  		oos.writeObject(instance);
        File file = new File("singleton_file");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        // 反序列化【读】操作
        HungrySingleton newInstance = (HungrySingleton) ois.readObject();
        System.out.println(instance);
        System.out.println(newInstance);
        System.out.println(instance == newInstance);
  • 攻击原理

jdk的源码InputStream在读对象的时候,会通过反射生成一个新的对象,而不是拿原来对象的引用。

  • 防御方案
    1.通过jdk的方法定义,告诉jdk该类反序列化的时候不要反射,而要使用自己定义的应用。

     /**
     * 防止反序列化攻击,readResolve是源码中定义的方法名,当且仅当使用这个方法
     * @return
     */
    private Object readResolve(){
        return hungrySingleton;
    }
    

    2.使用枚举类的单例实现

    https://blog.csdn.net/chenghan_yang/article/details/90482237

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值