2016-05-05 3 views
0

私はこの次のコードでは二次のSQLインジェクションに直面してきた(春アプリケーション)

if(subjectId!=null){Query query= sessionFactory 
      .getCurrentSession() 
      .createSQLQuery(HubQueryConstants.GET_QUERY) 
      .setParameter(MyConstants.SUBJECT_ID, subjectId) 
      .setFirstResult(offset) 
      .setMaxResults(limit) 
      .setResultTransformer(
        Transformers.aliasToBean(MyClass.class));} 

私の定数ファイルは以下のとおりです。

定数ファイルがfinalクラスでありますそれは、デフォルトでは、静的なクエリであるにもかかわらず

GET_QUERY="Select * from MyClass where id=:id "; 

まだ私のセキュリティレポートは、2次のSQLインジェクションとしてそれを与えている

インターフェイスに定数を宣言する必要がありますか?セキュリティ問題を回避するには?

+1

の終わりにNamedNativeQuersを使用してチュートリアルを見つけます。 – Andreas

+1

私はあなたのクエリのidパラメータにsqlを挿入できるという懸念があると思います。しかし、あなたのhibernate(私は推測すると)あなたのクエリがpreparedStementに変換されているので。だからあなたは救われるべきです。 – EisenRatte

+0

私は上記のスニペットでSqlクエリを使用していますが、HQLクエリを使用していますが、私のレポートでは2番目のSQLインジェクションが表示されています –

答えて

0

SQL挿入は、プレースホルダが元のSQL文字列を変更するSQL用語で置き換えられ、SQLがintened以外の何かを実行するときに発生します。

あなたはパラメータのプレースホルダが交換される際にSQLインジェクションが起こるSQL_injection

で詳細を見つけることができます。だから、プロパティからSQLを読み込む代わりに定数を宣言しても役立たない。注入は、SQL文字列がどこから得られたかとは無関係に後で発生します。

SQL注入を防止する最も簡単な方法は、プリペアドステートメントを使用することです。

プリペアドステートメントが実行されると、SQL文字列とパラメータはSQLサーバーによって完全に分離されて処理され、SQLインジェクションは不可能になります。

JPAを使用すると、注釈javax.persistence.NamedNativeQuery;を使用して、プリペアドステートメントとして実行されるSQLクエリを宣言できます。

あなたは、私はあなたのセキュリティレポートが間違っていると言うだろうjpa-native-queries

関連する問題