料AboutJavaScriptを有効にして、ご利用ください。スーパークラスに変更を加える場合、サブクラスの依存性を保つコードをモジュール化し再利用性を高めるために、プログラムロジックを複数のクラスやファイルに分割することがよくある。スーパークラスに変更を加える場合(たとえばコードの保守時)には、サブクラスが依存しているプログラムの不変条件(invariant)を維持しなくてはならない。関係するすべての不変条件を維持しないと、セキュリティ上の脆弱性を引き起こすことがある。違反コード以下の違反コード例では、銀行取引関連の情報を保持するクラスAccountを使っている。セキュリティはこのクラスでは考慮されておらず、サブクラスであるBankAccountに任されている。クライアントアプリケーションは、セキュリティメカニズムを持つBankAccountを使用しなければならない。}}ある日、Accountクラスを保守するプログラマがoverdraft()というメソッドを新規追加した。BankAccountクラスを保守するプログラマは変更に気付かなかった。そのため、クライアントアプリケーションは悪意ある呼出しに対して脆弱になってしまった。BankAccountオブジェクトに対してoverdraft()メソッドを直接呼び出すことができ、本来存在すべきセキュリティチェックを回避される。以下の違反コード例にこのような脆弱性を示す。}}このコードは期待通りに動作するが、危険な攻撃の余地を与えている。overdraft()メソッドではセキュリティチェックを行っていないため、悪意あるクライアントプログラムは認証なしでoverdraft()メソッドを呼び出すことができる。}}適合コード以下の解決法では、BankAccountクラスにおいてoverdraft()メソッドをオーバーライドし、呼び出されるやいなや例外をスローするようにしている。することで、overdraftの機能の誤用を防止している。この適合コードの他の部分には変更はない。}}設計上、親クラスの新規メソッドをオーバーライドせず直接サブクラスから呼び出せるようにしておきたいのであれば、新規メソッドの中でセキュリティマネージャのチェックを実施するという解決法もある。(Calendar)以下の違反コード例は、java.util.Calenderクラスのafter()メソッドとcompareTo()メソッドをオーバーライドしている。Calendar.after()メソッドの返り値は、Calendarが表す時間がObject引数が指定する時間よりも「後」かどうかを示すboolean値である。プログラマは、2つのオブジェクトが同じ日時を指す場合もafter()メソッドがtrueを返すようにこの機能を拡張したいと考えている。compareTo()をオーバーライドし、「曜日で比較」オプションを提供しようとしている(たとえば、ウィークデイかどうかを調べるために、今日の日付が週の最初の日かどうかを比較する。週のはじまりは国によって異なる)。他の抽象メソッドの実装}java.util.CalendarクラスはcompareTo()メソッドとafter()メソッドを提供する。表す時刻より後の時刻を表すかどうかを返す。ない場合、このメソッドはfalseを返す。compareTo()がafter()を呼び出すのかが明記されていない。おけるafter()の実装は以下のようになっている。0;}この実装では、2つのオブジェクトはまず初めに、オーバーライドしたCalendarSubclass.after()メソッドを使って比較される。次にスーパークラスのCalendar.after()メソッドを呼び出し、残りの比較を行う。Calendar.after()メソッドは内部でcompareTo()メソッドを呼び出しており、これはCalendarSubclass.compareTo()を呼び出して処理を行う。CalendarSubclass.after()は実際にはCalendarSubclass.compareTo()を呼び出し、falseを返す。サブクラスを使用するプログラマはCalendar.after()の実装の詳細を知らず、スーパークラスのafter()メソッドはオーバーライドしたサブクラスのメソッドではなくスーパークラスのメソッドだけを呼び出すと誤って想定している。コンストラクタにおいてオーバーライド可能なメソッドを呼び出さない」は同様のプログラミングエラーについて解説している。一般に、この手のエラーが発生する理由は、スーパークラスの実装に依存したコーディングをしていることにある。このような想定は最初は正しくても、スーパークラスの実装の詳細は何ら知らされることなく変更されることがある。メンバフィールドを持つforwarderクラスを新規に導入する。これは継承ではなくコンポジション(composition)である。Calendarクラスの具体的インスタンス実装を参照する。CompositeCalendarと呼ばれるラッパークラスを用意し、前述の違反コードのCalendarSubclassと同様のオーバーライドメソッドを提供している。}}ForwardingCalendarクラスの各メソッドは、内包するCalendarImplementationクラスに処理を渡し、返り値を得る。このメカニズムを転送(forwarding)と呼ぶ。ForwardingCalendarクラスの大部分は、CalendarImplementationクラスの実装から独立している。したがって、将来CalendarImplementationクラスが変更されることがあっても、ForwardingCalendarクラスを壊すことはなく、同様にCompositeCalendarクラスも影響を受けない。オーバーライドしたCompositeCalendarのafter()メソッドを呼び出すことで、CalendarImplementation.compareTo()メソッドを呼び出し、必要な比較を行う。super.after(when)を使用するとForwardingCalendarに転送され、CalendarImplementation.after()メソッドが呼び出される。結果として、java.util.Calendar.after()はCalendarImplementation.compareTo()メソッドを呼び出し、プログラムは正しくtrueを出力する。リスク評価サブクラスに及ぼす影響を考慮せずにスーパークラスに変更を加えると、脆弱性につながる恐れがある。スーパークラスの実装の変更を考慮せずに設計されたサブクラスは間違った動作をし、データの不整合や制御フローの管理ミスなどにつながる。適切に自動検出することは困難である。1.2においてjava.util.HashtableクラスのentrySet()メソッドが導入された結果、java.security.Providerクラスは脆弱になってしまった。Providerクラスはjava.util.Propertiesを拡張し、java.util.PropertiesはHashtableを拡張している。Providerクラスは、暗号アルゴリズム名(たとえば"RSA")をその実装を提供するクラスにマップする。Providerクラスはput()メソッドやremove()メソッドをHashtableから継承し、それらにセキュリティマネージャによるチェックを追加している。セキュリティマネージャによるチェックにより、悪意あるコードは新たなマッピングの追加や削除を行うことはできない。entrySet()の導入により、信頼できないコードがHashtableからマッピングを削除することが可能になってしまった。