0

たとえば、私のコードでは、ソース クエリの疑問符の数がデータの特徴に基づいて変化する場所がいくつかあります。SQL にユーザー データを配置していませんが、疑問符の数を調整しています。これを行う唯一の方法は、文字列の連結/フォーマット/etc を使用することです。これにより、Findbugs から次の警告がトリガーされます。

準備済みステートメントが非定数文字列から生成された

Findbugs に脆弱性であると思わせることなく SQL を自動生成する (コードの臭いではない) 方法はありますか?

私が今持っているもののコード例:

final static String BASE_SQL = "SELECT * FROM customers WHERE id IN (questionMarkPlaceholder)";

[...]

final String questionMarks = "?" + StringUtils.repeat(", ?", customers.length - 1);
final String sql = BASE_SQL.replaceFirst("questionMarkPlaceholder", questionMarks);
statement = conn.prepareStatement(sql);

int counter = 1;
for (Customer customer : customers) {
    statement.setString(counter, customer.getId());
    counter++;
}

resultSet = statement.executeQuery();
4

2 に答える 2

1

動的な数のパラメーターに対して手動で文字列を連結する必要のない永続化 API がいくつかあります。 Hibernate CriteriaQuerydslには、この問題を回避する DSL があります。

特定のケースでは、値がユーザー入力からのものではないため、クエリは脆弱ではありません。FindBugs 警告は、誤検知と見なすことができます。リモート ユーザーが値を制御できることがわかった場合は、ESAPI ユーティリティ クラスEncoder.encodeForSQLを使用できます。

于 2013-10-08T22:39:24.580 に答える