16

ユーザーがかなり柔軟な基準でデータベースを照会できるようにしたいと考えています。次のものを使用できます。

String slqCmdTxt = "SELECT * FROM TheTable WHERE " + userExpression;

ただし、これが SQL インジェクションに対して広く開かれていることはわかっています。パラメータを使用するのは良いことですが、非常に柔軟なクエリを許可する方法がわかりません。

SQL インジェクションに心を開かずに柔軟なデータベース クエリを許可するにはどうすればよいですか?


詳細:

実際には、マスターと属性を持つセカンダリの 2​​ つのテーブルがあります。1 つのマスタ レコードに多くの属性が含まれる場合があります。両方のテーブルの値に対してクエリを実行します。結果は、単純なテーブル ビューよりも読みやすいレポートに処理されます。データは C# プログラムによって書き込まれますが、現在の方向性は、Java で記述されたコンポーネントからテーブルをクエリすることです。

そのため、ユーザー入力を提供して安全にクエリを作成する方法が必要です。限られた一連の入力に対して、指定された入力とパラメーター値を使用してクエリ文字列を作成するコードを作成しました。次に、入力値をパラメーターとして追加します。これにより、複雑な文字列のカチネーションが発生し、変更/拡張が困難になります。

Javaで作業しているので、いくつかの検索により、jOOQのようなSQLステートメント構築ライブラリが見つかりました...

4

4 に答える 4

8

おそらく、ユーザーがドロップダウンからテーブルを選択してフィルターを追加できるUIを作成する必要があります。TOADやDBVisualizer、さらにはSQLDeveloperを使用したことがある場合は、すべてUIにテーブルを選択できる部分があり、実際にSQLを記述しなくても、ユーザーはUIコントロールからフィルターや並べ替えを追加できます。

次に、もちろん、UIの背後にあるコードで、フィルター入力を検証し、それらをプリペアドステートメントのパラメーターとして使用します(使用している言語によって異なります)。

たとえば、これは、データベースオブジェクトを参照してテーブルをクリックしたときに、DBVisualizer(Javaで記述されている)のUIにあるものです。ドロップダウンから任意の列を選択し、次に別のドロップダウンから演算子(=、>、> =、<、<=、LIKE、INなど)を選択して、ユーザー定義の値を入力できることに注意してください。フィルタ値。

DBVisualizer UI

UIで非常によく似たことができます。

ちなみに、アプリケーションを作成する言語を含めると役に立ちます。推測する必要がある場合は、文字列宣言に基づいてJavaまたはC#と言いますが、必ず知っておくとよいでしょう。

于 2012-07-12T23:17:52.953 に答える