最近、私のプロジェクトのセキュリティ チームが、コード レビューの一部として使用するように設計された安全なコード ガイドライン ドキュメントをリリースしました。最初に印象に残ったのは、「内部クラスを使用しないでください」という項目でした。これは非常に手荒で抜本的な声明のように思えました。内部クラスは正しく使用すれば良いのですが、少しグーグルで調べたところ、便宜上ここに引用されているthisを見つけました。
ルール 5: 内部クラスを使用しない
一部の Java 言語の本では、内部クラスには、それを囲んでいる外部クラスからのみアクセスできると書かれています。本当じゃない。Java バイト コードには内部クラスの概念がないため、内部クラスはコンパイラによって通常のクラスに変換され、同じパッケージ内の任意のコードにたまたまアクセスできます。また、ルール 4 は、保護のためにパッケージのスコープに依存しないことを示しています。
しかし、待ってください、それは悪化します。内部クラスは、それらのフィールドが非公開と宣言されていても、囲んでいる外部クラスのフィールドにアクセスできます。そして、内部クラスは別のクラスに変換されます。この個別のクラスが外部クラスのフィールドにアクセスできるようにするために、コンパイラはこれらのフィールドをプライベートからパッケージ スコープに暗黙のうちに変更します。内部クラスが公開されるだけでも十分ではありませんが、一部のフィールドを非公開にするという決定をコンパイラが黙って却下するのはさらに悪いことです。できる限り内部クラスを使用しないでください。(皮肉なことに、新しい Java 2 doPrivileged() API の使用ガイドラインでは、内部クラスを使用して特権コードを記述することを提案しています。これが、doPrivileged() API が気に入らない理由の 1 つです。)
私の質問は
- この動作は Java 5/6 でもまだ存在しますか?
- 外部クラスと内部クラス以外の、外部クラスのプライベート メンバーにアクセスしようとしたクラスがコンパイルされないことを考えると、これは実際にセキュリティ リスクになるのでしょうか?
- 「ガイドライン」「内部クラスを使用しない」を保証するのに十分なセキュリティリスクをもたらしますか?