Java Security Manager полностью отключил отражение

Я читал довольно много вопросов на Stackru по этому вопросу, но не смог найти решение или ответ на мою проблему. Если бы он уже был, я был бы признателен, если бы кто-нибудь дал подсказку...

Моя проблема / вопрос в том, возможно ли полностью отключить отражение для ненадежного кода? Функции как getDeclaredMethods()(См. Test.java). У меня уже есть менеджер безопасности Java, который выдает исключения безопасности, если код пытается написать / прочитать / и т.д....

Если это возможно, может кто-нибудь показать мне, как?

Bruno

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 ответа

Решение

Поэтому я решил проблему не напрямую с помощью 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!");
    }
}

Расширьте свой SecurityManager и сделайте так, чтобы он проверял ReflectPermission а также RuntimePermission, Затем вы должны решить, есть ли у вызывающего абонента разрешение на 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");
    }
}

Пока мы не предоставляем менеджера безопасности, частные члены класса могут быть доступны. Для доступа к закрытым членам класса вы должны установить setAccessible (true), это позволит вам получить доступ к закрытым членам. Ограничение доступа к закрытым членам. Оставьте строчку кода в своем неизменяемом конструкторе классов.

System.setSecurityManager (новый SecurityManager());

Это вызовет исключение AccessControlException при попытке установить setAccessible(true).

Другие вопросы по тегам