2010-12-13 3 views
5

JPAを学び始めています。使用するためにリファクタリングする必要があるかなりの量の従来のEJB2.0コードがあります新機能、およびコードベースに追加する新しい機能について説明します。私のコードで説明する必要がある新しい攻撃ベクトルがあるか、または防御プログラミングが私をカバーしますか?Java Persistence API(JPA)で目にする必要があるセキュリティ上の懸念事項

答えて

6

JPAはJDBCのようなものです。バックエンド技術です。 JDBCに適用されるのと同じセキュリティ上の懸念がJPAに適用されます。したがって、ほとんどのセキュリティの考慮事項はアプリケーションレベルで実装されるか、フロントエンドAPIによって処理されます。しかし、確かにJPQL注入はあなたが知っておくべき明白なものです。

JPQL注入:

ただ、SQLまたはJDBC APIを使用しているとき、あなたは直接クエリ文字列にパラメータを追加することはありませんが好きです。 QueryオブジェクトのsetParameterを使用するか(アドホッククエリと名前付きクエリの両方に適用されます)、JPA criteria APIを使用することができます(ただし、名前付きクエリが最適なパフォーマンスを提供します)。

Query query = em.createQuery("DELETE Order WHERE customer = :customer"); 
query.setParameter("customer", customer); 
query.executeUpdate(); 

データベース権:

余分なセキュリティのために、あなたが作ることができ、複数の永続ユニット(PU)ので、すべてのセキュリティ侵害の影響は限定的です。たとえば、異なるデータベースアクセス権を持つ複数のPUを作成することができます.1つは更新権限があり、もう1つは読み取り専用のクエリアクセスです。このような意思決定がアプリケーション設計に影響することを理解してください。

+0

アプリケーション層にPreparedStatementを作成していますか?それらを使用すること(AFAIK)はSQLインジェクションに対する主な防御であり、通常はデータレイヤーで作成されます。 – bakoyaro

+1

良い点。ベストプラクティスが習慣になれば、悪い選択肢を忘れることがあります。私はそれを私の答えに加えました。 – Kdeveloper

+1

プレーンテキストプロトコルを開発するたびに、ロシアのハッカーはタイプセーフティの欠如を悪用します。 –

1

信頼できないソースから受け取ったバイトからオブジェクトを逆シリアル化すると、ブートクラスパス上のすべてのクラスがpublicかどうかに関わらずロードされ、そのクラスの初期化が実行されます。また、副作用を伴うコンストラクタやカスタム非直列化メソッドを使用して権限を取得することもできます。

クラスパスがよく権威は直列化可能クラスのコンストラクタを介して到達可能であること、最新のJVMに同梱されてRhinoの通訳、またはjavacにjavax.toolsインタフェースのような無制限の権限を持つpublicクラスを、知ら含まれている場合は、攻撃者はこれを使用して任意のJavaコードを実行することができます。実際には、これは、java.lang.Runtimeを介して現在のユーザーの特権を持つ任意のユーザー呼び出しコードを意味します。

最初の基準は容易に満たされます。 2番目の方はおそらくそれほど簡単には出会えないでしょう。

+1

これはJPAと何か関係があるのか​​どうかは分かりません。 – Kdeveloper

+0

+1あなたのご意見をお寄せいただきありがとうございます。 – bakoyaro

+0

@Kdeveloper、私はJPAエンティティがシリアライズ可能である必要があるという印象を受けました。しかし、あなたは正しい。 JPAエンティティが永続性のためにJavaシリアル化を使用していない場合、私の投稿は無関係です。 –

関連する問題