3

今のところ、私は hibernate で 4 種類のトランザクションを行うことを知っています。

  1. オブジェクトの使用
  2. HQL の使用
  3. DB 固有の SQL の使用
  4. 基準の使用 (QBE)

さて、注射に対する彼らの強さに関しては、次のように思います(間違っていたら訂正してください):

  1. 内部 SQL 呼び出しがパラメーター化されているため、安全です。
  2. クエリがパラメーター化されている場合は安全であり、それ以外の場合は安全ではありません。
  3. #2と同じですが、ポータブルではありません。
  4. 安全でない?

私の質問は #4 の Query by Example についてです。これも脆弱であることがわかったからです。例:

    Account a = new Account(); //POJO class       
    a.setId("1' OR '1'='1");

    //s is a org.hibernate.Session instance
    Criteria crit = s.createCriteria(Account.class);
    crit.add(Example.create(a));
    List results = crit.list();  //table dump!

このスニペットは、accounts テーブル全体を選択します。注射を防ぐ方法はありますか?どのように?

注: Hibernate 3.6.5 final を使用しています。テスト データベースは HSQLDB です。

更新: 私にもバグのように思えますが、実際には注入された SQL とは関係がない可能性があります。ID に存在しない値を設定しようとしましたが、すべての行が返されます。'1'='1' の代わりに '5'='5' を使用して注入を試みましたが、5 は SQL 呼び出しに伝搬されません。(1=1) を where 句として使用し続けます。

更新 2: 解決済み。以下の回答を参照してください。

4

2 に答える 2

1

Hibernate QBE は id (PK にマップされた) フィールドを無視します。これは、id フィルターが行のみを返すために行われたようであり、これは get() または load() で実現できます。id に like 条件を使用したい場合はどうすればよいのだろうか???

hibernate 公式フォーラムの関連記事:

https://forum.hibernate.org/viewtopic.php?t=927063

https://forum.hibernate.org/viewtopic.php?t=938036

于 2011-07-25T06:12:26.567 に答える
0

コードで入力をサニタイズできます。たとえば、ID フィールドに Long 値を設定する必要があります。

于 2011-07-19T11:49:04.290 に答える