0

MySQL に保存されたルーチンがあり、それらを Java Spring アプリケーションから呼び出す必要があります。現在、私は次のようにしています:

result = org.springframework.jdbc.core.JdbcTemplate.query(
     "CALL MyRoutine(?, ?);", 
     myRowMapper, 
     parameterOne, 
     parameterTwo);

質問:

  • これは、信頼性、セキュリティ、およびパフォーマンスの観点から、これを行うための推奨される方法ですか? または、別のベスト プラクティス アプローチはありますか?
  • この方法は SQL インジェクション攻撃に対する防御策ですか?
  • パラメータの順序は重要であり、混乱しやすくなっています。それを回避する方法はありますか?
4

2 に答える 2

1

を使用して、パラメーターの順序を回避できますNamedParameterJdbcTemplatehttp://static.springsource.org/spring/docs/3.0.x/reference/jdbc.htmlを参照

于 2013-06-18T08:32:25.243 に答える
1
  1. 選択したアプローチは、JDBC 呼び出し構文 ( JDBC 接続の構文 prepareCall SQL を参照) の代わりにベンダー構文を使用するため、データベース間で移植できません (これは問題にならない場合があります)。Spring JDBC は、ストアド プロシージャを呼び出すためのさまざまな方法を提供しますが、明確な最善の方法はありません。
  2. これは、ストアド プロシージャ自体が SQL インジェクション (パラメーターをクエリに連結する) に対して脆弱でない限り、SQL インジェクションに対して安全です。
  3. #setX(String, X)のメソッドを使用して、ストアド プロシージャのパラメータをインデックスではなく名前でバインドできますCallableStatement。これは、データベース ドライバーでサポートされていない可能性があります。NamedParameterJdbcTemplateこれは、まだインデックスによってバインドされているものとは異なります。NamedParameterJdbcTemplateまた、クエリを解析して書き換えるため、オーバーヘッドが発生することにも注意してください。
于 2017-11-22T08:25:51.150 に答える