【问题标题】:How to restrict developers to use reflection to access private methods and constructors in Java?如何限制开发人员使用反射访问Java中的私有方法和构造函数?
【发布时间】:2011-11-25 20:50:00
【问题描述】:

如何限制开发者使用反射访问Java中的私有方法和构造函数?

使用普通的 Java 代码,我们无法访问类之外的私有构造函数或私有方法。但是通过使用反射,我们可以访问 Java 类中的任何私有方法和构造函数。

那么我们怎样才能为我们的 Java 代码提供安全性呢?

【问题讨论】:

  • 这对于签名的 jar 来说是一个不错的选择。 “在任何情况下,都不允许对此 jar 文件中的类进行反射”。但我认为,没有这样的功能。

标签: java security reflection


【解决方案1】:

使用SecurityManager 和足够严格的security policy 运行您的应用程序。

short summary in the tutorial 有一个the security documentation 和大量信息。

【讨论】:

    【解决方案2】:

    在所有私有方法/构造函数中添加 checkPermission() 方法。 通过断言callerClass=selfClass 使用sun.reflect.Reflection.getCallerClass(int n) 检查权限。

    getCallerClass 返回方法 realFramesToSkip 的类在堆栈中向上帧(从零开始),忽略与 java.lang.reflect.Method.invoke() 及其实现相关的帧。第一帧是与此方法关联的帧,因此getCallerClass(0) 返回sun.reflect.Reflection 的Class 对象。

    public class PrivateConstructorClass {
    
        private PrivateConstructorClass() {
            checkPerMission();
                  //you own code go below
        }
    
        void checkPerMission() {
            Class self = sun.reflect.Reflection.getCallerClass(1);
            Class caller = sun.reflect.Reflection.getCallerClass(3);
            if (self != caller) {
                throw new java.lang.IllegalAccessError();
            }
        }
    }
    

    你可以试试reflect,会失败:

    public class TestPrivateMain {
    
        Object newInstance() throws Exception {
    
            final Class<?> c = Class.forName("package.TestPrivate");
    
            final Constructor<?> constructor = c.getDeclaredConstructor();
            constructor.setAccessible(true);
            return constructor.newInstance();
    
        }
    
        public static void main(String[] args) throws Exception {
            Object t = new TestPrivateMain().newInstance();
        }
    } 
    

    【讨论】:

    • 嗯...但在我看来确实是一个很好的尝试。不稳定的 API 一开始就不应该存在
    【解决方案3】:

    您(作为相关代码的开发者)不能这样做。

    运行应用程序的最终用户可以安装一个禁止反射的 SecurityManager。

    【讨论】:

    • 他当然可以。他在应用程序启动期间安装了安全管理器。
    • 除非他是应用程序的开发者,否则这不是一个选项。我更多地考虑了他“希望限制开发人员 [可能是应用程序的] 使用反射”来反对他希望保持私有的方法的情况。
    • 是什么阻止他在他的类中使用静态初始化程序来安装安全管理器?并且ofc会抛出一个异常,防止class laoding,如果他不能安装呢?
    猜你喜欢
    • 2012-07-14
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2016-08-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多