Java Java EE 6とJSF-2.0を使用して、すべてのデータベース操作に永続性APIを使用しています。
バックエンドはMySQLですが、すべての操作でEJB-QLのEntityManager関数と名前付きクエリを使用しました。この場合、SQLインジェクション攻撃は可能ですか?
次のようにSQL/JPQL文字列でユーザー制御変数をインライン化している場合にのみ可能です。
String sql = "SELECT u FROM User u WHERE id=" + id;
あなたがそれをしておらず、パラメータ化された/名前付きクエリのみを使用しているなら、あなたは安全です。
はい、可能です。実装方法によって異なります。
JPAクエリ言語でのインジェクションの防止 をご覧ください。
JPAプロバイダーがインジェクション攻撃を処理するためにすべての入力引数を処理する場合は、カバーする必要があります。 EclipseLinkで細くします。
前の投稿者が述べたように、独自のJPQLまたはSQL(ネイティブクエリ用)をつなぎ合わせると、公開される可能性があります。
JPQL/SQLを構築するために、文字列を連結するよりもパラメーター付きの名前付きクエリを使用することをお勧めします。
ダグ
攻撃的/実用的な観点から質問する場合、JPQLステートメントがユーザー入力から作成される場合は、次のユーザー入力を検討してください。
blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42
被害者がJPA実装> = 2.1を使用しており、バックエンドデータベースがOracleである場合、上記のようなものがブールSQLインジェクションとして機能し、データベースユーザーが「A」で始まるかどうかを通知します。