2012-02-12 15 views
0

SQLインジェクションを防ぐためにEJB3の安全性を知りたいと思います。
私はプリペアドステートメントを使用することは非常に安全であることを読んだが、これEJB3 SQLインジェクション

@Override 
public Collection<Project> searchProjectsPerProfessorLastname(String lastname) { 
    Query q = manager.createQuery("SELECT DISTINCT OBJECT(p) FROM Project p JOIN p.professors prof WHERE lower(prof.lastName) = ?1"); 
    q.setParameter(1, lastname.toLowerCase()); 
    @SuppressWarnings("unchecked") 
    Collection<Project> c = q.getResultList(); 
    if(c.size()==0) 
     return null; 
    return c; 
} 

のような機能を持つインスタンスのためには、SQLインジェクションを行うことができますか?簡単に言えば

+0

表示されているのはEJBではなくJPAです。 JPAが使われているEJB Beanかもしれませんが、これはこの質問には関係ありません。 –

答えて

1

、限り、あなたは動的SQLを構築する(と結合SQLを構築していない)していないとして、SQLインジェクションの危険性はありません。バグのあるSQLドライバを除外します。

バインディングは、単純にSQLテキストを構築するのではなく、ドライバを介してSQL文にパラメータを割り当てる技術です。

さまざまなドライバがありますが、SQLインジェクションが行われる理由は、SQLインジェクションを防止するための適切な予防措置(特に特殊文字の引用符などのエスケープ)がないということです。

理想的には、ドライバーはSQLを適切に構築するために注意します。しかし、ドライバーが何らかの形でバギーになっている場合、まだいくつかのリスクがあります。私は、個人的に、これに影響を与えたバグを持っているドライバーに遭遇していません。それは可能ですが、本当に、本当に遠いです。

最後に、たとえばSQLを使用していなくても、JPAクエリ言語であるEQLを使用しています。これはEQLからSQLに変換される必要があります。これにより、SQLインジェクションを防止するための介入ソフトウェア(JPAとJDBCドライバ)の機会が増えます。

+0

明確かつ完全な答えです。ありがとう。 – Simon

+0

これはEQLではなく、JPQLです... –

0

JPA呼び出しのすべてのパラメータ化されたクエリ形式は、SQLインジェクションに対して安全とみなされます。ただし、安全ではない連結でクエリ文字列を作成することはできます。

関連する問題