web-dev-qa-db-ja.com

HibernateなどのORMフレームワークはSQLインジェクションを完全に軽減しますか?

すべてまたはほとんどのSQLインジェクション攻撃を防ぐには、パラメーター化されたクエリを使用する必要があることを知っています。 SQLステートメントを手書きする代わりに、しばらくの間Hibernateを使用しています。この層の悪用を目的とした既知の攻撃や研究はありますか?

18
Casey

いいえ、あなたは自動的に安全ではありません。
SQLインジェクションは引き続き存在できます。

OWASPページ から:

SQLインジェクションに関する注意

これはホットなトピックなので、ここで取り上げますが、後で詳しく説明します。

  • HibernateはSQLインジェクションへの耐性を付与しません。APIを誤用する可能性があります。
  • HQL(SQLのHibernatesサブセット)の影響を受けやすくする特別なものはありません。
  • CreateQuery(String query)やcreateSQLQuery(String query)などの関数は、commit()の呼び出しが行われたときに実行されるQueryオブジェクトを作成します。クエリ文字列が汚染されている場合、SQLインジェクションがあります。これらの機能の詳細については、後で説明します。
13
AviD

他の回答に加えて、ORMが役に立たない可能性がある1つの領域は、ORMコード自体に問題があることです。たとえば、Rails some versions before )のActiveRecordにはいくつかの問題があり、SQLインジェクションはユーザーが作成したコードではなくフレームワーク自体にありました。

そうは言っても、ORMを正しく使用するとSQLインジェクションを回避するのがはるかに簡単になるので、手動でクエリを作成するのではなく、それを実行することは良い戦略になります。

4
Rory McCune

これには ブログ投稿 SQLインジェクションに対して脆弱になるnHibernateのCreateSQLQueryを使用したサンプルコードと、ORMフレームワークでパラメーター化されたクエリを使用して同じクエリを記述し、インジェクションを回避する適切な方法があります。結局のところ、SQLクエリをどのように作成しても、文字列連結またはORMを使用してオブジェクトや属性として入力を処理する場合、動的クエリを作成すると、注入されたSQLコードがデータベースで実行されます。しかし、それをパラメーター化すると、データベースに「選択」または「挿入」クエリがこれら2つの入力を使用して送信されることを伝え、入力にSQLコードが含まれていても、データベースはそれらを実行しません。

0
Goli E