• 设计模式单例模式防止反射漏洞攻击


    // *****************************现象描述*******************************
    package com.example.SpringBootTest1.shejimoshi.singleton;
    public class InnerclassSingleton {
    private InnerclassSingleton() {};
    private static class Singleton {
    private static final InnerclassSingleton i = new InnerclassSingleton();
    }

    public static InnerclassSingleton getInstance() {
    return Singleton.i;
    }
    }
    
    
    // 通过反射获取对象拿到的对象不是同一个
    public class Test {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
    Constructor<InnerclassSingleton> declaredConstructor = InnerclassSingleton.class.getDeclaredConstructor();
    declaredConstructor.setAccessible(true);
    InnerclassSingleton instance1 = declaredConstructor.newInstance();
    InnerclassSingleton instance2 = InnerclassSingleton.getInstance();
    System.out.println(instance1 == instance2); // false
    }
    }

    // *********************************防止漏洞攻击*****************************
    package com.example.SpringBootTest1.shejimoshi.singleton;
    public class InnerclassSingleton {
    private InnerclassSingleton() {
    if (InnerclassSingleton.getInstance() != null) {
    throw new RuntimeException("单例模式不允许创建多个实例");
    }
    };

    private static class Singleton {
    private static final InnerclassSingleton i = new InnerclassSingleton();
    }

    public static InnerclassSingleton getInstance() {
    return Singleton.i;
    }
    }

    // 运行这段代码通过反射去创建实例时会报自定义异常, 从而达到防止反射漏洞攻击
    public class Test {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
    Constructor<InnerclassSingleton> declaredConstructor = InnerclassSingleton.class.getDeclaredConstructor();
    declaredConstructor.setAccessible(true);
    InnerclassSingleton instance1 = declaredConstructor.newInstance();
    InnerclassSingleton instance2 = InnerclassSingleton.getInstance();
    System.out.println(instance1 == instance2);
    }
    }

  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/ladeng19/p/15827018.html
Copyright © 2020-2023  润新知