【问题标题】:Reflection Security反射安全
【发布时间】:2013-01-16 09:05:48
【问题描述】:

如何通过不允许MethodFieldConstructor 对象调用setAccessible(true) 来强制反射安全? SecurityPolicy 文件或其他文件?

对于独立的 Java 应用程序,通常没有注册 SecurityManager

我用这个System.setSecurityManager(new SecurityManager());

这种方法适用于调用方法。

我想强制执行整个 jar 或使用该 jar 的客户端代码不允许调用 setAccessible(true);

有更好的方法吗?

谢谢。

【问题讨论】:

    标签: java security reflection policy securitymanager


    【解决方案1】:

    嗯,它确实适用于 setAccessible。见:

    class A {
      private String method1() {
        return "Hello World!";
      }
    }
    

    import java.lang.reflect.Method;
    
    class B {
      public static void main(String[] args) throws Exception {
        System.setSecurityManager(new SecurityManager());
        Class clazz = A.class;
        Method m = clazz.getDeclaredMethod("method1");
        m.setAccessible(true);
      }
    }
    

    结果

    Exception in thread "main" java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")
            at java.security.AccessControlContext.checkPermission(Unknown Source)
            at java.security.AccessController.checkPermission(Unknown Source)
            at java.lang.SecurityManager.checkPermission(Unknown Source)
            at java.lang.reflect.AccessibleObject.setAccessible(Unknown Source)
            at B.main(B.java:8)
    

    它可能对您不起作用的一个原因是,根据this post 中的 cmets,它过去不能在 Java 1.5 中工作,但在 6 及之后的版本中工作。


    编辑:要对特定的 jar 拒绝它,您需要使用策略文件,例如:

    // specific file
    grant codeBase "file:/test/path/tools.jar" {
      // no permissions for this one
    };
    
    // default to giving all
    grant {
      permission java.security.AllPermission;
    };
    

    有两种指定策略文件的方法,或者将其作为默认值添加,或者仅提供指定的文件 (source):

    如果你使用

    java -Djava.security.manager -Djava.security.policy==someURL SomeApp
    

    (注意双等号)然后指定的策略文件将是 用过的;安全属性文件中指示的所有内容都将是 忽略。

    ...或者实现一个自定义安全管理器,doesn't look that hard。不过我自己没有这样做。

    【讨论】:

    • 好像也有another thread同一个主题。
    • 我想在我的应用程序中强制不调用 setAccessible 方法。
    • @peterwkc 是的,我已经回答您可以使用 SecurityManager 做到这一点?
    • 如何使用 SecurityManager 做到这一点?你的意思是自定义安全管理器?
    • @peterwkc 不,使用标准的,就像我的例子一样。但您需要使用策略文件或自定义安全管理器来仅针对特定 jar 拒绝它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2011-02-08
    • 2017-03-06
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多