Java Security Manager完全禁用反射

时间:2016-10-24 12:53:01

标签: java reflection securitymanager policies

我一直在阅读有关此问题的Stackoverflow上的很多问题,但无法找到解决方案或解决我的问题。如果已经有人,如果有人提示,我将不胜感激......

我的问题/问题是,是否可以完全禁用不值得信赖的代码的反射?像getDeclaredMethods()这样的函数(参见test.java)。我已经有了一个Java安全管理器,如果代码尝试写/读/等,它会抛出安全例外。 ......

如果有可能,有人可以告诉我怎么样?

布鲁诺

test.java

TestClass cls = new TestClass();
Class c = cls.getClass();

// returns the array of Method objects 
Method[] m = c.getDeclaredMethods();
for(int i = 0; i < m.length; i++) {
   System.out.println("method = " + m[i].toString());
}

3 个答案:

答案 0 :(得分:5)

所以我没有直接用checkPermission()解决了这个问题。我的解决方法是检查是否访问了java.lang.reflect包。

@Override
public void checkPackageAccess(String pkg){

    // don't allow the use of the reflection package
    if(pkg.equals("java.lang.reflect")){
        throw new SecurityException("Reflection is not allowed!");
    }
}

答案 1 :(得分:4)

扩展您的SecurityManager,并检查ReflectPermissionRuntimePermission。然后你必须决定调用者是否具有Reflection的权限:

@Override
public void checkPermission(Permission perm) {
  if (perm instanceof ReflectPermission) {
    // called for Method.setAccessible(true)
    // determine whether caller is permitted    using getClassContext()
  }
  if (perm instanceof RuntimePermission) {
    if (perm.implies(new RuntimePermission("accessDeclaredMembers"))) {
      // called for Class.getDeclardFields()
      System.out.println("getDeclaredFields() called");
    }
}

答案 2 :(得分:0)

只要我们不提供安全管理器,就可以访问班级的私有成员。要访问班级的私人成员,您应该设置 setAccessible(true),这将使您能够访问私人成员。限制访问私有成员将下面的代码行保存在不可变的类构造函数中。

System.setSecurityManager(new SecurityManager());

当您尝试设置setAccessible(true)时,这将引发AccessControlException。