web-dev-qa-db-ja.com

.jarを封印する理由は何ですか?それをどのように確認しますか?

密封されたjarファイルを作成しましたが、密封されていないjarファイルを使用した場合と比較して違いはありません。

  • 瓶が密封されていることを確認するためにどのようなテストを実行できますか?
  • シールされていないものを使用することを好む理由は何ですか?
  • 封印すると、プロジェクトのユーザーに問題が発生しますか?
8
Aquarius Power

Jarファイルで使用されるパッケージに存在するクラスを定義することにより、jarがシールされていることをテストできます。ジャーが密封されている場合、すべてのパッケージは通常密封されていますが、それ以外の場合は、パッケージごとに密封できます。作成したクラスは、そのパッケージ内のクラスの保護されたメンバーまたはデフォルトのメンバーにアクセスしようとする必要があります。

たとえば、jarにクラスcom.example.Widgetがあり、パッケージcom.exampleがシールされており、Widgetに保護された/デフォルトのメンバーがある場合、それらのメンバーへのアクセスを試みるクラスcom.example.Testを作成します。これは失敗するはずです。

シーリングの理由は、テスト方法の説明にあります。コードを自己完結させ、jarのユーザーはonlypublicを使用する必要がありますメンバー。パッケージは、プログラムで使用されるjar(およびIDEのbinフォルダー)全体で一意である必要はありません。 jarと同じパッケージでクラスを定義し、問題を引き起こす可能性のあるprotected/defaultメンバーにアクセスできます。多くの場合、デフォルトの可視性はC++のfriendキーワードの類似物として使用され、同じパッケージ内の他のクラスが、同じプログラマーが両方のクラスで作業して内部を理解するため、安全であるだけのアクションを実行できるようにします。おそらく、デフォルトの可視性メソッドは、クライアントコードがアクセスしないことを理解して、パフォーマンスの名前の一部の境界チェックを無視します。たとえば、JavaのStringクラスには、これらのタイプのメソッドがいくつかあります。これは、大量のコードがそれに依存するため、文字列の処理が高速である必要があるためです。BigDecimalは、 BigIntegerおよびデフォルトのアクセスを使用して、クラスの他のユーザーが使用してはならないいくつかの操作を最適化します。

TL; DR :同じパッケージ内のクラスは、パフォーマンスまたは単純化のために、お互いの非パブリックメンバーにアクセスする場合があります。このアクセスでは、不変条件と前提条件がチェックされない場合があります。クラスパスの複数の場所にある同じパッケージのクラスを配置できます。パッケージまたはjarをシールすると、クライアントコードがこれらのメソッドにアクセスできなくなります。

これは、jarのユーザーに問題を引き起こしません。 jar内のリソース(クラスファイルなど)にアクセスするクラスローディングメカニズムは、密封されたjarおよびパッケージを完全にサポートします。

関連資料: JARファイル内のパッケージのシール

9
user22815

2番目の質問に答えるために、Jarをセキュリティ対策として封印します。これにより、実行時に追加のクラスがコードベースに追加されるコードインジェクションのフォームが防止されます。

ユーザー入力に基づいてオブジェクトが作成されるコードには、ある程度の反映があります。これらのオブジェクトを作成するコードでは、固定パッケージ名のクラスのみをインスタンス化できます。

ユーザーが作成できるようにしたいクラスを含むjarをシールすることにより、ユーザーが危険な可能性のある新しいクラスを作成して、実行時にソフトウェアでインスタンス化できるようにする方法はありません。クラスが正しいパッケージにない限り、コードはそれをロードせず、Jarをシールすると、ユーザーがアクセスできるようにしたいクラスだけがアクセス可能になります。

私たちの瓶が封印されていなかった場合、ユーザーはインスタンス化できる新しいクラスを追加する可能性があります。これはセキュリティ上のリスクになります。

TL; DR:Jarsを封印することで、1種類の悪意のあるコードインジェクションを防ぐことができます。

2
Mark Douglas