今のところ、私は hibernate で 4 種類のトランザクションを行うことを知っています。
- オブジェクトの使用
- HQL の使用
- DB 固有の SQL の使用
- 基準の使用 (QBE)
さて、注射に対する彼らの強さに関しては、次のように思います(間違っていたら訂正してください):
- 内部 SQL 呼び出しがパラメーター化されているため、安全です。
- クエリがパラメーター化されている場合は安全であり、それ以外の場合は安全ではありません。
- #2と同じですが、ポータブルではありません。
- 安全でない?
私の質問は #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: 解決済み。以下の回答を参照してください。