ホームページ > データベース > mysql チュートリアル > SQL インジェクションを防ぐために JDBC で IN 句をパラメータ化する最適な方法は?

SQL インジェクションを防ぐために JDBC で IN 句をパラメータ化する最適な方法は?

Patricia Arquette
リリース: 2025-01-15 11:00:44
オリジナル
876 人が閲覧しました

How to Best Parameterize IN Clauses in JDBC to Prevent SQL Injection?

JDBC のパラメータ化された IN 句のベスト プラクティス

背景:

パラメータ化された SQL クエリは、SQL インジェクション攻撃を防止し、コード効率を向上させるために重要です。 IN 句を使用する場合、一般的なタスクは複数の値をパラメータとして渡すことです。この質問では、Java の JDBC を使用してさまざまなデータベース プラットフォームでこれを実現するためのベスト プラクティスを検討します。

答え:

残念ながら、JDBC には IN 句を直接パラメータ化する方法がありません。ただし、一部の JDBC ドライバーは、この目的で PreparedStatement#setArray() の使用をサポートしている場合があります。ただし、このサポートはデータベース固有です。

この制限を回避するには、String#join() と Collections#nCopies() を使用して IN 句に必要なプレースホルダーを生成するカスタム ヘルパー関数を使用することをお勧めします。さらに、ヘルパー関数を使用して、PreparedStatement#setObject() を使用してループ内に値を設定できます。

コード例:

これらのヘルパー関数の使用方法を示すコード例を次に示します。

<code class="language-java">public static String preparePlaceHolders(int length) {
    return String.join(",", Collections.nCopies(length, "?"));
}

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}</code>
ログイン後にコピー

このコードは、パラメーター化された IN 句を使用するメソッドに統合できます。

<code class="language-java">private static final String SQL_FIND = "SELECT id, name, value FROM entity WHERE id IN (%s)";

public List<entity> find(Set<Long> ids) throws SQLException {
    List<entity> entities = new ArrayList<>();
    String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size()));

    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(sql);
    ) {
        setValues(statement, ids.toArray());

        try (ResultSet resultSet = statement.executeQuery()) {
            while (resultSet.next()) {
                entities.add(map(resultSet)); // 假设map方法已定义
            }
        }
    }

    return entities;
}</code>
ログイン後にコピー

注: 一部のデータベースには、IN 句で許可される値の数に制限があります。たとえば、Oracle には 1000 プロジェクトという制限があります。

これらのヘルパー関数を使用すると、JDBC で IN 句を安全かつ効率的にパラメータ化できるため、SQL インジェクションの脆弱性を回避し、コードの移植性を確保できます。 map(resultSet) メソッドは、entity クラスに基づいて適切に実装する必要があることに注意してください。

以上がSQL インジェクションを防ぐために JDBC で IN 句をパラメータ化する最適な方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート