【问题标题】:Java reflection framework and securityJava反射框架和安全性
【发布时间】:2011-02-08 19:20:31
【问题描述】:

假设我的应用程序的外部库中有一个单例类。但我还是可以 使用反射创建该特定类的实例。像这样

    Class clas = Class.forName(Private.class.getName());

    for(Constructor c : clas.getDeclaredConstructors()){
        c.setAccessible(true);
        Private p = (Private) c.newInstance();
        System.out.println(p);
    }

我该如何限制呢? .

谢谢 J

【问题讨论】:

标签: java reflection


【解决方案1】:

你可以这样做。

private static final Private INSTANCE = new Private();
    private Private() {
        if(INSTANCE !=null)
            throw new IllegalStateException("Already instantiated");
    }
     public static Private getInstance() {
            return INSTANCE;
        }

【讨论】:

  • 单身人士在第三方 jar 中无法触及。所以这根本没有帮助。顺便说一下,这种技术并不安全,因为您可以通过反射来更改它(如问题中所述)。
【解决方案2】:

AFAIK 这是一种元编程,因此需要检查不同的抽象层。从 Javadoc 我想,您应该使用 SecurityManager 来强制执行您想要的行为:setAccessible()。 一般来说,恕我直言,当您进行元编程和更改访问权限时,您应该真正知道自己在做什么。

【讨论】:

    【解决方案3】:

    如果您特别谈论单例:这就是实现它们的最佳方式是通过枚举的原因之一:

    public enum YourSingleton {
        INSTANCE;
        // methods go here
    } 
    

    如果您谈论的是一般使用 setAccessible():如果代码是由您不信任的人编写的,不会使用这种不正当手段,那么您无论如何都不应该运行它(或在沙箱中运行它)。在开发人员中,应将公共/私有视为有关代码打算如何使用的元信息,而不是作为安全功能。

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      通过使用SecurityManager 和控制ReflectPermission("suppressAccessChecks") (example)。

      虽然安全管理器会影响性能,但它很少在服务器端使用。

      【解决方案6】:

      我不认为你可以限制这一点。

      使用反射来访问他人的私有部分显然是一种危险/值得怀疑的做法(snicker),但有时各种类型的工具和应用程序都需要这样做。

      【讨论】:

        【解决方案7】:

        长话短说:你不能

        任何构造函数,无论是公有的还是私有的,都可以通过反射访问并用于实例化一个新对象。

        您将需要使用其他方法,例如SecurityManager

        【讨论】:

          猜你喜欢
          • 2023-03-27
          • 2010-11-25
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 2017-11-21
          • 2013-01-16
          • 1970-01-01
          • 2017-03-06
          相关资源
          最近更新 更多