2011-01-19 5 views
6

は、Hibernate HQL order by節でSQLインジェクションを処理する簡単な方法です。名前付きパラメータは明らかに機能しません。HQL order by節でSQLインジェクションを処理します。

EDIT:

この問題を処理するあなたの方法を投稿してお気軽に。私は他の人のソリューションを見て、それらから教えたいです。

ご協力いただきありがとうございます。

+0

なぜlinqでnhibernateを使用しないのですか? – Dave

+0

@Daveこんにちは、私はlinqにアクセスできないようにJavaを使用しています。 –

+0

私は、nHibernateではなく、ROMの休止状態を選択したはずです!これを解決することを幸運。 – Dave

答えて

3

HQLの代わりにHibernate criteria APIを使用できます。

基準APIは、注文基準が有効なプロパティを参照しているかどうかをチェックします。

あなたがそのようないろいろ書いてみた場合:

public void testInjection() { 
    String orderBy = "this_.type desc, type"; 

    Criteria crit = this.getSession().createCriteria(DemoEntity.class); 
    crit.addOrder(Order.asc(orderBy));  
    crit.list(); 
} 

をあなたはAbstractPropertyMappingによってスローQueryException: "could not resolve property this_ of de.test.DemoEntity" を取得します。

+0

こんにちは、回答ありがとうございますが、基準APIに切り替えることができないプロジェクトを実行しています。だから私はあなたが何を指しているのかを正確に探していますが、HQLにあります。 –

0

Hibernateは、SQLインジェクションに対して既にガードしているPreparedStatementを使用します。 PreparedStatmentでは、引数は、プレーン・テキストのSQL文が発行されるのではなく、文にバインドされます。 hibernateを使用する場合、SQLインジェクションについて心配する必要はありません。

ここには、ハイバネートがSQLインジェクションClick Hereから安全であることを保証するスレッドがあります。

+0

はい、それは本当ですが、PreparedStatmentでsetParameterを使用すると、SQLは by 'name' ...>のようになり、結果は順序通りではありません。 >。私は許可されたフィールドのいくつかのテーブルを管理することを回避する簡単な方法を探しています。 –

1

私は避けたかった解決策でした。私はkeyをURLにユーザが見ているもので、valueはORDER BY句の後にあるDBのカラムをmapに実装しました。