1

Tomcat サーバー アプリケーション用に Java で DAO レイヤーを作成しています。

クエリをラップするプリペアド ステートメントを使用したい (1. クエリを 1 回解析する、2. SQL インジェクションを防御する)、私のデータベース設計には、データ ソース システムごとに MyISAM テーブルが含まれています。また、DBO を介したクエリのほとんどは、さまざまなテーブル名を引数として使用する選択です。

このテーブルの一部は、その場で作成できます。

私はすでに、Prepared ステートメントの引数としてテーブル名を使用できないことを説明する多くの投稿を調べました。

この引数を処理し、結果を文字列としてクエリに追加できる何らかのタイプの関数 (mysql_real_escape_string など) を使用することを提案するソリューションを見つけました。

最適化された方法でそれを実行できる組み込みの Java ライブラリ関数はありますか、または DAO レイヤーで何か他のことを行うことを提案する可能性があります (DB 自体にルーチンを追加することは好みません)。

4

2 に答える 2

4

テーブル名に制限を適用できますか? 引用するよりも簡単かもしれません。たとえば、すべてのテーブル名が次の正規表現に一致する必要があると言える場合[0-9A-Za-z_]+、引用は必要ないと思います。スペースが必要な場合は、おそらく常に使用して回避できますが`table name`、「完全な」引用符について心配する必要はありません。

利用可能なものを制限することは、多くの場合、すべての可能性を処理するよりもはるかに簡単です:)

于 2012-07-25T07:35:48.027 に答える
1

より安全にしたい場合は、クエリを準備し、提供されたテーブル名で呼び出して、実際に存在するかどうかを確認できます。

PreparedStatement ps = conn.prepareStatement("SHOW TABLES WHERE tables = ?");
ps.setString(1, nameToCheck);
if(!ps.executeQuery().next())
  throw new RuntimeException("Illegal table name: " + nameToCheck);

(現在WHERE、私の指の下に mysql がないため、状態を修正する必要があるかもしれません)。

于 2012-07-25T10:16:36.967 に答える