2016-10-24 19 views
6

Czytałem sporo pytań na temat Stackoverflow na temat tego pytania, ale nie mogłem zakończyć znalezienia rozwiązania lub odpowiedzi na mój problem. Jeśli już istnieje, byłbym wdzięczny, gdyby ktoś dał podpowiedź ...Java Security Manager całkowicie wyłącza odbicie

Mój problem/pytanie jest, czy można całkowicie wyłączyć odbicie za niegodny zaufania kod? Funkcje takie jak getDeclaredMethods() (Zobacz test.java). Mam już program Java Security Manager, który wyrzuca wyjątki bezpieczeństwa, jeśli kod próbuje zapisać/odczytać/etc. ...

Jeśli to możliwe, czy ktoś może mi pokazać, jak?

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

Odpowiedz

4

Więc rozwiązał problem nie bezpośrednio z checkPermission(). Moim obejściem jest sprawdzenie, czy dostęp do pakietu java.lang.reflect jest możliwy.

@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

Rozszerz securityManager i go sprawdzić ReflectPermission i RuntimePermission. Następnie musisz zdecydować, czy rozmówca ma pozwolenie na refleksję:

@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

skopiowane kodu oraz dodano 'rzucić nowe SecurityException (...)' ale wyjątek nie zostanie rzucony ... funkcja nie jest nawet nazywany ... – Bruno

+0

Tak, to nie nazywa dla 'getDeclaredMethods()', ale jeśli chcesz uzyskać dostęp do prywatnych/chronionych metod przez 'Method.setAccessible (true)' wywoływany jest 'SecurityManager'. – Stefan

+0

Zaktualizowałem answear dla sprawdzenia dla 'getDeclardXYZ()'. Mam nadzieję, że to pomoże. – Stefan

Powiązane problemy