Récemment, l'équipe de sécurité de mon projet a publié un document sur les lignes directrices en matière de code sécurisé, conçu pour être utilisé dans le cadre de nos examens de code. La première chose qui m'a frappé est un point qui dit "Ne pas utiliser de classes internes". Cela m'a semblé être une déclaration très lourde et très générale. Les classes internes sont bonnes si elles sont utilisées correctement, n'est-ce pas ? mais j'ai fait un peu de recherche sur Google et j'ai trouvé cette cité ici par souci de commodité.
Règle 5 : Ne pas utiliser de classes internes
Certains ouvrages sur le langage Java indiquent que classes internes ne peuvent être accédées que par les par les classes externes qui les entourent. Ce n'est pas le cas. Le code d'octets Java a n'a pas de concept de classes internes, de sorte que les sont traduites par le compilateur en classes ordinaires qui se trouvent être qui se trouvent être accessibles à tout code dans le même même paquet. Et la règle 4 dit de ne pas dépendre de l'étendue du paquetage pour la protection.
Mais attendez, il y a pire. Une classe a accès aux champs de la classe extérieure de la classe externe qui l'entoure, même si ces sont déclarés privés. Et la est traduite en une classe classe distincte. Afin de permettre à cette classe distincte d'accéder aux champs de la la classe externe, le compilateur modifie silencieusement silencieusement ces champs de privé à en champ d'application du paquetage ! [ ] que la classe interne soit exposée, mais c'est encore pire que le compilateur silencieusement votre décision de de rendre certains champs privés. N'utilisez pas de classes internes si vous pouvez l'éviter. (Ironiquement, la nouvelle utilisation de l'API Java 2 doPrivileged() de l'API Java 2 suggèrent d'utiliser une classe interne pour pour écrire du code privilégié. C'est l'une des raison pour laquelle nous n'aimons pas l'API doPrivileged()).
Mes questions sont les suivantes
- Ce comportement existe-t-il encore dans java 5 / 6 ?
- S'agit-il réellement d'un risque de sécurité, étant donné que toute classe, autre que les classes externe et interne, qui tenterait d'accéder aux membres privés de la classe externe ne se compilerait pas ?
- Cela pose-t-il un risque de sécurité suffisant pour justifier la "ligne directrice" "Ne pas utiliser de classes internes" ?