0

データベースからデータを引き出す必要があるという要件があります。クエリは-

SELECT e.Data AS EntityBlob, f.Data AS FpmlBlob 
FROM [Trades.InventoryRecord] ir, EntityBlob e, FpmlBlob f 
WHERE %s AND uid = e.uid AND uid = f.uid

ここで %s は、ユーザーが html フォームから入力する where 句の後の述語です。

ユーザー入力は次の形式になります:
1. TradeDate = ' 2013-04-05' AND IsLatest = 'TRUE'
2. StreamId= ' IA0015'
3. クエリには IN 句も含まれる場合があります

このクエリがレンダリングされると、あいまいな列 streamId またはあいまいな列 IsLatest の例外が発生します。これらの列は、同じ名前の複数のテーブルに存在するためです。したがって、このあいまいさを取り除くには、クエリを ir.IsLatest または ir.StreamId のように変更する必要があります。

Java コードでこれを行うには、最初に where 句の後の述語を解析し、列名を抽出し、各列名の前にテーブル名のエイリアス「ir」を挿入して、クエリが次のようになるようにする必要があります。

SELECT e.Data AS EntityBlob, f.Data AS FpmlBlob 
FROM [Trades.InventoryRecord] ir, EntityBlob e, FpmlBlob f 
WHERE ir.TradeDate = '2013-04-05' AND ir.IsLatest = 'TRUE' AND uid = e.uid AND uid = f.uid

この述語を解析する最良の方法は何ですか、または同じ結果を達成できる他の方法がある場合はどうすればよいですか?

4

1 に答える 1

0

この質問に対する私の答えは、ユーザー入力を解析しないことです。うまくいかないことが多すぎます等値、不等値、範囲、ステートメント内などを選択するためのドロップダウンとボタンを備えた UI があれば、はるかに優れています。より多くの作業のように思えるかもしれませんが、SQL インジェクション攻撃から身を守ることはさらに重要です。また、悪意のある SQL インジェクションについて心配していなくても、ユーザーはすべてを正確に実行する必要があります。そうしないと、ステートメントが失敗します。

于 2013-08-16T10:00:36.703 に答える