2

私のプロジェクトで SQL インジェクション攻撃を回避するために、パラメーター化されたクエリの方法でデータベースにアクセスしようとしています。現在、以下のように等しいケースを処理する方法を知っています(Spring JdbcTemplateを使用):

String sql = "SELECT * FROM T_USER WHERE USERNAME = ? AND PASSWORD = ?"
jdbcTemplate.query(sql, 
                   new UserRowMapper(), 
                   new Object[]{"%admin%", "%password%"});

上記のコードは問題なく実行されますが、「IN」ケースを処理する方法がわかりませんでした。以下は私のケースであり、動作に失敗しました:

String sql = 
   "SELECT * FROM T_USER WHERE USERNAME = ? AND PASSWORD = ? AND CLASS_ID IN (?)"
jdbcTemplate.query(sql, 
                   new UserRowMapper(), 
                   new Object[]{"%admin%", "%password%", "1,2,3"});

誰か案内してくれませんか?どうもありがとう。

4

2 に答える 2

1

List を作成し、それを 3 番目のパラメーターとして渡すことができると思います。また、最初の 2 つの列フィルターLIKEの代わりに使用する必要があります。=

List<Integer> classIds = new ArrayList<Integer>();
classIds.add(1);
classIds.add(2);
classIds.add(3);

String sql = "SELECT * FROM T_USER WHERE "+
              "USERNAME LIKE ? AND PASSWORD LIKE ? AND CLASS_ID IN (?)";
jdbcTemplate.query(sql, new Object[]{"%admin%", "%password%", classIds},
                                                         new UserRowMapper());

注意: 構文は次のとおりです。

public List query(String sql, Object[] args, RowMapper rowMapper) 
             throws DataAccessException

編集:namedParameterJdbcTemplatebwlowとして試してください:

String sql = "SELECT * FROM T_USER WHERE "+
           "USERNAME LIKE :uname AND PASSWORD LIKE :passwd AND CLASS_ID IN (:ids)";
 Map<String, Object> namedParameters = new HashMap<String, Object>();
 namedParameters.put("uname", "%admin%);
 namedParameters.put("passwd", "%password%");
 namedParameters.put("ids", classIds);
 List result = namedParameterJdbcTemplate.query(sql, namedParameters, 
                                                             new UserRowMapper());
于 2012-11-02T04:10:13.920 に答える
0

3 つのオプション:

  1. IN LIST の長さごとに異なる JDBC クエリを生成し、各 INDIVIDUAL アイテムをパラメータ化します。たとえば、この回答
  2. 小さなテーブルの場合、この回答など、LIKEステートメントをごまかして使用できます
  3. SPLIT 関数 (アンチ LISTAGG) を使用して、区切りリストをそれぞれ 1 列の個々の行に変換し、それに対して JOIN を実行します。SPLIT 関数の例
    • 関数への引数を単一の文字列としてパラメーター化します
于 2012-11-02T04:04:39.633 に答える