反射安全性



如何通过不允许MethodFieldConstructor对象调用setAccessible(true)来强制反射安全性?安全策略文件还是其他内容?

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

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

此方法适用于调用方法。

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

有什么更好的方法吗?

谢谢。

,它确实适用于setAccess。看:

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)

它可能不适合你的一个原因是,根据这篇文章中的评论,它没有用于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;
};

有两种方法可以指定策略文件,要么将其作为默认值的添加,要么仅指定策略文件(源):

如果您使用

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

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

。或者实现一个自定义安全管理器,这看起来并不难。不过我自己没有这样做。

最新更新