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.