[目次] [前項目] [次項目]
オブジェクト直列化システムを使えば、オブジェクトグラフからバイトストリームを作成し、(ディスクに保管するか、ネットワークを介して)Java 環境の外へ送り、それを使って、同じ状態をもつ前と同等な新しいオブジェクトセットを再作成することができます。
オブジェクトの状態がこの環境の外でどうなるかは、(定義により)Java システムの制御外のことであり、したがって、システムで提供されるセキュリティの制御外のことです。ここで疑問がわきます。それでは、オブジェクトが直列化された後、結果の配列を調べて、たとえば、ウィルスを Java プログラムに注入することが可能なのか。このセクションの目的は、このようなセキュリティの心配に応えることです。
オブジェクト直列化の目標は、できる限りシンプルでありながら、知られているセキュリティの制約と一貫性があることです。システムがシンプルであるほど、安全である可能性はより高くなります。次のポイントは、オブジェクト直列化におけるセキュリティがどのように実装されているのかを要約したものです。
- java.io.Serializable か java.io.Externalizable インタフェースを実装するオブジェクトだけが直列化可能。一定のフィールドや一定のクラスを直列化しないためのメカニズムがある。
- 直列化パッケージを使って同じ オブジェクトを再作成することはできないし、オブジェクトが直列化復元で上書きされることは決してない。直列化パッケージでできることは、新しい オブジェクトを作成し、特定の方法で初期化することだけである。
- オブジェクトの直列化復元によってオブジェクトのクラスのためのコードがロードされることがあるが、その際、ロードされるコードは、通常の Java のコード検証とセキュリティの管理によるすべての保証によって保護される。直列化復元によってロードされるクラスは、その他の方法でロードされる場合と同じように保護される。
- 外部化可能オブジェクトは、readExternal メソッドが public であるため、上書きされる危険がある。
ファイルハンドルなど、システムリソースに対する直接ハンドルは、アドレス空間に依存する種類の情報ですので、オブジェクトの持続性状態の一部として書き込むことはできません。したがって、このような情報をもつフィールドは、transient として宣言しなければなりません。そうすれば、それらが直列化されることはありません。これは、transient キーワードの新しい意味でも、重複した意味でもないことに注意してください。
ファイルハンドルのようなリソースが transient で宣言されていない場合は、オブジェクトが直列化状態にいる間に変更される可能性があり、それが直列化復元されたとき、リソースのアクセスが適切でない可能性があります。
直列化復元されたオブジェクトが、保証されるべきある不変量のセットを壊す状態にならないよいうに、クラスがそれ独自の直列化と直列化復元のメソッドを定義することができます。あるクラスのデータメンバ間で維持する必要がある不変量のセットがある場合、これらの不変量について知り得るのはそのクラスだけですので、これらの不変量を検査する直列化復元メソッドを提供するかどうかは、そのクラスの作成者次第です。
このことは、セキュリティを心配していない場合でも重要です。ディスクファイルが壊れ、直列化データが無効になることも可能です。したがって、そのような不変量を検査することは、単にセキュリティのためだけではありません。これは有効性を確保する手段なのです。しかし、これを行うことができるのは、特定クラスのためのコードの中だけです。なぜなら、どの不変量を維持し、検査するかを直列化パッケージで判断する方法がないからです。
Java 仮想マシンの外でバイトストリームを保護する別の方法は、直列化パッケージで作成したストリームを暗号化することです。バイトストリームを暗号化すれば、直列化されたオブジェクトの private 状態をデコードされ、読み込まれることが防げます。
この実装では、直列化/直列化復元に対してクラスが特別な独自のメソッドをもつことができることと、直列化のためのストリーム抽象を使用することによって、暗号化が可能です。これにより、その出力を他のストリームやフィルタに組み込むことができます。
[目次] [前項目] [次項目]
Copyright (C) 1996, 1997 Sun Microsystems, Inc. All rights
reserved.