テーブル名をパラメータとしてSQLクエリに入れる安全な方法は何ですか? PreparedStatementを使用してテーブル名をパラメータとして指定することはできません。ステートメントを使用して動的テーブル名でクエリを実行するために文字列を連結することは可能ですが、SQL インジェクションのリスクがあるため推奨されません。これを行うための最良のアプローチは何ですか?
3 に答える
設計上の問題を解決しようとするので、テーブル名を動的に設定する必要はありません。これが不可能な場合は、使用可能なテーブルのリストを管理し、ユーザーがそこから 1 つを ID で選択する設計を採用します。これにより、選択した ID から実際のテーブル名を取得し、テーブル名のプレースホルダーをそれに置き換えることができます。 、テーブル名の置換でSQLインジェクションの可能性を回避します。
動的 JDBC クエリで実際のパラメーターのみを許可するのには理由があります。パラメーターは外部から取得でき、任意の値を取ることができますが、テーブルと列の名前はstaticです。
主に、異なるテーブルがほぼ同じ構造を持ち、DRY の原則により、テーブル (または列) 名を変更するだけで同じクエリを何度も繰り返したくない場合に、テーブルまたは列名をパラメーター化するユース ケースが存在する可能性があります。しかし、そのユースケースでは、プログラマーは置換される名前を完全に制御でき、それらのいずれにもタイプミスがないことを慎重にテストする必要があります => ここでは SQL インジェクションの可能性はなく、テーブルを安全に置き換えることができますクエリ文字列の名前。
クエリがフォーム フィールドに入力されたものを使用するインターネット上に公開された Web アプリケーションの場合、これはまったく異なります。ここでは、元の無害なクエリを終了し、新しい有害なクエリを偽造するセミカラムを含む、あらゆることが発生する可能性があるためです => SQL インジェクションパラメータ化されたクエリを正しく作成するのではなく、文字列を連結するだけの場合。
テーブル名または列名がユーザーによってフォーム フィールドに入力された文字列である可能性があるユース ケースは想像できません。これが、それらをパラメーター化できる唯一の理由です。