2016-11-01 18 views
-2

TomcatでHibernateを使用しています。私たちは最近、HibernateのコードにSQLインジェクション脆弱性を発見しました。具体的には、私たちがORMのために使用するPOJOの規制当局である。POJO経由でHibernateでSQLインジェクションを防ぐ方法

私たちは、ユーザの入力に取って、このような新しいPOJOを作成している:

//POJO associated with Foo.hib.xml 
public class Foo{ 
    private String a; 
    private String b; 

    public Foo(String a, String b){ 
     this.a=a; 
     this.b=b; 
    } 

    //Getters go here 
} 

私たちは、Tomcatのplatmformのさまざまな部分全体に様々な休息のサービスで使用されている。このような多くの多くのPOJOを持っています。私たちが何であるかの単なる一般的な例である上記

//example of possible injection 
Foo foo = new Foo("select * from *;", "insert * into * as *"); 
//save new Foo to hibernate 
session.saveOrUpdate(foo); //above queries will be executed on insert 

:私たちが見つかった問題は、ユーザーが、我々はそれを作成し、それを保存するときに、彼らは、SQLインジェクションを行うことができますfooの値として、SQLクエリを設定することができるということです見て。

これまで私が見つけたのは、照会のデータをサニタイズするための例であり、ハイバネートを通しての挿入値ではありません。データベースに挿入する前にpojoのデータを消毒する方法はありますか?

+0

hibernateは実際にそのSQLを実行しませんか? –

+0

私は2番目にしたい:いくつかの奇妙なマッピングオプション(これまで聞いたことがない)がない限り、HibernateをSQLとしてフィールドの内容を実行することは不可能でなければならない!この結論にどうやって来ますか? – Robin

答えて

0

単純な答え:

あなたは直接以下のように入力データにHQL/SQLクエリ文字列連結されていないことをesnureする必要があります:あなたはsetParameter()を使用してデータを設定する必要があり、むしろ

//Unsafe Hibernate query, Never do this 
Query query = session.createQuery(" from Employee where empId='"+inputEmpId+"'"); 

org.hibernate Query APIによって提供されるメソッド(またはJDBC PraparedStatementsの場合はsetString("")などを使用します)

//Safe Hibernate query 
Query query = session.createQuery(" from Employee where empId=:empId"); 
query.setParameter("empId", inputEmpId); 

長い回答については、hereをご覧ください。

関連する問題