【问题标题】:Replacement for Security Manager checkMemberAccess()替换安全管理器 checkMemberAccess()
【发布时间】:2019-05-18 08:42:40
【问题描述】:

Java 安全管理器方法checkMemberAccess() 有一个参数,其中包含调用反射的类。此方法已被弃用,并说明使用 checkPermission() 代替。 checkPermission() 中没有与checkMemberAccess() 类似的参数。

在安全管理器中,如何在没有checkMemberAccess() 方法的情况下获取反射目标类?

即如果 A 类对 B 类执行反射,我想知道 target 是 B 类。

【问题讨论】:

    标签: java securitymanager


    【解决方案1】:

    当您安装默认安全管理器时 - 应用程序将使用默认安全策略。如果你想提供我们自己的政策,你可以在一个政策文件中这样做:

    grant {
       permission java.lang.RuntimePermission "accessDeclaredMembers.{class name}";
       permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
    };
    

    CheckMemberAccess 具有默认策略 - 允许访问 PUBLIC 成员,以及访问与调用者具有相同类加载器的类。在所有其他情况下,此方法使用 RuntimePermission("accessDeclaredMembers") 权限调用 checkPermission()

    对于反射操作,请使用 ReflectPermission 类和 suppressAccessChecks,它允许抑制标准 java 访问检查 - 针对公共、默认(包)访问、受保护和私有成员 -由反射对象在其使用点执行。

    但这很危险,因为信息(可能是机密)和通常不可用的方法会被恶意代码访问。

    一旦您提供了策略文件 - 您可以按如下方式进行检查:

     try {
       ReflectPermission permission = new ReflectPermission("suppressAccessChecks");
       permission.checkGuard(null);
       System.out.println("Permission granted");
     } catch (SecurityException e) {
       System.out.println("Permission denied");
     }
    

    【讨论】:

    • 我想允许对所有类进行反射,但阻止对一组特定类的反射。我可以这样做还是需要在 grant 块中添加数千个条目?
    • 还有其他几种方法可以阻止反射操作:1)setAccessible() 2)RetentionPolicy 注解的类获得一个RuntimeInvisible\RuntimeVisible 类属性或者不会出现在反编译的类中 3) 使用@ Java 9 中的 987654326@ 概念和反射权限
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多