Recientemente, el equipo de seguridad de mi proyecto publicó un documento de pautas de código seguro, diseñado para ser utilizado como parte de las revisiones de nuestro código. Lo primero que me llamó la atención fue un artículo que decía "No use clases internas". Pensé que esto parecía una declaración muy arriesgada y arrolladora. Las clases internas son buenas si se usan correctamente ¿cierto ?, pero hice un poco de búsqueda en Google y encontré this, aquí citado para mayor comodidad.¿Las clases internas de Java representan un riesgo de seguridad?
Regla 5: No utilice clases internas
Algunos libros de lenguaje Java dicen que clases internas sólo se puede acceder por las clases externas que les rodean. Esto no es verdad. El código de bytes Java tiene sin concepto de clases internas, por lo que las clases internas son traducidas por el compilador en las clases ordinarias que pasan a ser accesibles a cualquier código en el mismo paquete . Y la Regla 4 dice que no se debe depender de en el alcance del paquete para la protección.
Pero espera, empeora. Una clase interna obtiene acceso a los campos de la clase externa , incluso si estos campos se declaran privados. Y la clase interna se traduce en una clase separada . Para permitir este acceso de clase por separado a los campos de la clase externa, el compilador cambia silenciosamente estos campos del ámbito del paquete privado al . Ya es suficientemente malo que la clase interna esté expuesta, pero es peor que el compilador que anula silenciosamente su decisión de hacer que algunos campos sean privados. No use las clases internas si puede evitarlo. (Irónicamente, el nuevo Java 2 directrices doPrivileged() uso de la API sugerimos que utilice una clase interna a escribir código privilegiado. Esa es una razón por la que no nos gusta la API doPrivileged()).
Mis preguntas son
- ¿existe todavía este comportamiento en java 5/6?
- ¿Es esto realmente un riesgo de seguridad, dado que cualquier clase, aparte de las clases externas e internas, que intentó acceder a los miembros privados de la clase externa no compilaría?
- ¿Representa un riesgo de seguridad suficiente como para justificar la 'guía' 'No utilizar clases internas'?
Espera un segundo? ¿Significa esto que "no puedo usar la forma más popular de crear devoluciones de llamada en Swing"? – Artyom
si esto es realmente una política de seguridad en su empresa durante la revisión del código, informe inmediatamente a su empresa a dailywtf.com –
@Zac Bowling: thedailywtf.com, la otra es solo una página de entrada. – nalply