すべてまたはほとんどのSQLインジェクション攻撃を防ぐには、パラメーター化されたクエリを使用する必要があることを知っています。 SQLステートメントを手書きする代わりに、しばらくの間Hibernateを使用しています。この層の悪用を目的とした既知の攻撃や研究はありますか?
いいえ、あなたは自動的に安全ではありません。
SQLインジェクションは引き続き存在できます。
OWASPページ から:
SQLインジェクションに関する注意
これはホットなトピックなので、ここで取り上げますが、後で詳しく説明します。
- HibernateはSQLインジェクションへの耐性を付与しません。APIを誤用する可能性があります。
- HQL(SQLのHibernatesサブセット)の影響を受けやすくする特別なものはありません。
- CreateQuery(String query)やcreateSQLQuery(String query)などの関数は、commit()の呼び出しが行われたときに実行されるQueryオブジェクトを作成します。クエリ文字列が汚染されている場合、SQLインジェクションがあります。これらの機能の詳細については、後で説明します。
他の回答に加えて、ORMが役に立たない可能性がある1つの領域は、ORMコード自体に問題があることです。たとえば、Rails some versions before )のActiveRecordにはいくつかの問題があり、SQLインジェクションはユーザーが作成したコードではなくフレームワーク自体にありました。
そうは言っても、ORMを正しく使用するとSQLインジェクションを回避するのがはるかに簡単になるので、手動でクエリを作成するのではなく、それを実行することは良い戦略になります。
これには ブログ投稿 SQLインジェクションに対して脆弱になるnHibernateのCreateSQLQueryを使用したサンプルコードと、ORMフレームワークでパラメーター化されたクエリを使用して同じクエリを記述し、インジェクションを回避する適切な方法があります。結局のところ、SQLクエリをどのように作成しても、文字列連結またはORMを使用してオブジェクトや属性として入力を処理する場合、動的クエリを作成すると、注入されたSQLコードがデータベースで実行されます。しかし、それをパラメーター化すると、データベースに「選択」または「挿入」クエリがこれら2つの入力を使用して送信されることを伝え、入力にSQLコードが含まれていても、データベースはそれらを実行しません。