web-dev-qa-db-ja.com

JPAでSQLインジェクション攻撃は可能ですか?

Java Java EE 6とJSF-2.0を使用して、すべてのデータベース操作に永続性APIを使用しています。

バックエンドはMySQLですが、すべての操作でEJB-QLのEntityManager関数と名前付きクエリを使用しました。この場合、SQLインジェクション攻撃は可能ですか?

42
Akshay

次のようにSQL/JPQL文字列でユーザー制御変数をインライン化している場合にのみ可能です。

String sql = "SELECT u FROM User u WHERE id=" + id;

あなたがそれをしておらず、パラメータ化された/名前付きクエリのみを使用しているなら、あなたは安全です。

45
BalusC

はい、可能です。実装方法によって異なります。
JPAクエリ言語でのインジェクションの防止 をご覧ください。

11
Jigar Joshi

JPAプロバイダーがインジェクション攻撃を処理するためにすべての入力引数を処理する場合は、カバーする必要があります。 EclipseLinkで細くします。

前の投稿者が述べたように、独自のJPQLまたはSQL(ネイティブクエリ用)をつなぎ合わせると、公開される可能性があります。

JPQL/SQLを構築するために、文字列を連結するよりもパラメーター付きの名前付きクエリを使用することをお勧めします。

ダグ

5
Doug Clarke

攻撃的/実用的な観点から質問する場合、JPQLステートメントがユーザー入力から作成される場合は、次のユーザー入力を検討してください。

blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42

被害者がJPA実装> = 2.1を使用しており、バックエンドデータベースがOracleである場合、上記のようなものがブールSQLインジェクションとして機能し、データベースユーザーが「A」で始まるかどうかを通知します。

0
hantwister