2016-10-24 4 views
6

Ich habe eine Menge Fragen zu Stackoverflow über diese Frage gelesen, konnte aber nicht aufhören, eine Lösung zu finden oder für mein Problem zu lösen. Wenn es schon einen gibt wäre ich dankbar, wenn jemand einen Hinweis geben würde ...Java Security Manager vollständig deaktivieren Reflexion

Mein Problem/Frage ist, ob es möglich ist, die Reflektion für nicht vertrauenswürdigen Code komplett zu deaktivieren? Funktionen wie (Siehe test.java). Ich habe bereits einen Java Security Manager, der Sicherheitsausnahmen auslöst, wenn der Code versucht,/etc. ...

Wenn es möglich ist, kann mir jemand wie zeigen?

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

Antwort

4

Also habe ich das Problem nicht direkt mit check gelöst(). Meine Problemumgehung besteht darin, zu überprüfen, ob auf das Paket java.lang.reflect zugegriffen wird.

@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

Erweitern Sie Ihre Security und es haben prüfen ReflectPermission und RuntimePermission. Dann müssen Sie entscheiden, ob der Anrufer die Erlaubnis für Reflexion hat:

@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

kopiert ich Ihren Code und fügte ein 'throw new Security (...)' aber die Ausnahme ausgelöst wird nicht ... wird die Funktion aufgerufen nicht einmal ... – Bruno

+0

Ja, ist es nicht genannt für 'getDeclaredMethods()', aber wenn Sie über 'Method.setAccessible (true) 'auf private/geschützte Methoden zugreifen wollen, wird der' SecurityManager' aufgerufen. – Stefan

+0

Ich habe die Answear für einen Check für 'getDeclardXYZ()' aktualisiert. Ich hoffe es hilft. – Stefan

Verwandte Themen