Comment limiter les développeurs à utiliser la reflection pour accéder aux méthodes privées et aux constructeurs en Java?

Comment limiter les développeurs à utiliser la reflection pour accéder aux méthodes privées et aux constructeurs en Java?

En utilisant du code Java normal, nous ne pouvons pas accéder à des constructeurs privés ou à des méthodes privées en dehors d’une classe. Mais en utilisant la reflection, nous pouvons accéder à toutes les méthodes privées et aux constructeurs d’une classe Java.

Alors, comment pouvons-nous sécuriser notre code Java?

Exécutez votre application à l’aide d’un SecurityManager et d’une stratégie de sécurité suffisamment ressortingctive.

Il y a un bref résumé dans le tutoriel et des informations détaillées dans la documentation de sécurité .

Ajoutez la méthode checkPermission() dans l’ensemble de votre méthode / constructeur privé. checkPermission utilisant sun.reflect.Reflection.getCallerClass(int n) en callerClass=selfClass .

La getCallerClass renvoie la classe de la méthode realFramesToSkip jusqu’à la stack (base zéro), en ignorant les images associées à java.lang.reflect.Method.invoke() et à son implémentation. La première image est celle associée à cette méthode. Ainsi, getCallerClass(0) renvoie l’object Class pour sun.reflect.Reflection .

 public class PrivateConstructorClass { private PrivateConstructorClass() { checkPerMission(); //you own code go below } void checkPerMission() { Class self = sun.reflect.Reflection.getCallerClass(1); Class caller = sun.reflect.Reflection.getCallerClass(3); if (self != caller) { throw new java.lang.IllegalAccessError(); } } } 

Vous pouvez essayer de réfléchir, cela échouera:

 public class TestPrivateMain { Object newInstance() throws Exception { final Class c = Class.forName("package.TestPrivate"); final Constructor constructor = c.getDeclaredConstructor(); constructor.setAccessible(true); return constructor.newInstance(); } public static void main(Ssortingng[] args) throws Exception { Object t = new TestPrivateMain().newInstance(); } } 

Vous (en tant que développeur du code en question) ne pouvez pas faire cela.

L’utilisateur final, qui exécute l’application, peut installer un SecurityManager qui interdit la reflection.