12

我已经在 Stackoverflow 上阅读了很多关于这个问题的问题,但无法退出为我的问题找到解决方案或答案。如果已经有一个,如果有人能给我一个提示,我将不胜感激......

我的问题/问题是是否可以完全禁用不可信代码的反射?类似的函数getDeclaredMethods()(参见 test.java)。我已经有一个 Java 安全管理器,如果代码尝试写入/读取/等,它会抛出安全异常。...

如果可能的话,有人可以告诉我怎么做吗?

布鲁诺

测试.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());
}
4

3 回答 3

6

所以我没有直接用 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!");
    }
}
于 2016-10-28T09:24:05.427 回答
5

扩展您的 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");
    }
}
于 2016-10-24T13:42:54.760 回答
1

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

System.setSecurityManager(new SecurityManager());

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

于 2018-07-16T15:16:20.273 回答