2016-10-24 7 views
6

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

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

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

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()); 
} 

ответ

4

Так что я решил проблему не непосредственно с 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!"); 
    } 
} 
3

Расширьте SecurityManager и это проверить ReflectPermission и RuntimePermission. Затем вы должны решить, имеет ли вызывающий разрешение на отражение:

@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"); 
    } 
} 
+0

Я скопировал код и добавил 'певд SecurityException (...)', но исключение не брошено ... функция даже не вызывается ... – Bruno

+0

Да, это не называется для 'getDeclaredMethods()', но если вы хотите получить доступ к приватным/защищенным методам с помощью метода Method.setAccessible (true), вызывается 'SecurityManager'. – Stefan

+0

Я обновил ответ для проверки 'getDeclardXYZ()'. Надеюсь, поможет. – Stefan