7

次のように、すべての列をカバーする条件を記述するのではなく (オプションのフィルタリングを可能にする)、多くの列を持つテーブルをクエリするためのフィルター オブジェクトがあります。

WHERE ((:value0 IS NULL) OR (column_name0 = :value0)) AND ((:value1 IS NULL) OR (column_name1 = :value1)) AND... etc

列ごとに。代わりに、理想的には、フィールド名をパラメーターとして渡すことができるようにしたいと思います。

WHERE :column_name0 = :value0 AND column_name1 = :value1 AND... etc

解析時に列が必要なため、これは不可能です (この回答hereと同様)。

これをどのように克服しますか?-新しい列が追加または削除されたときにSQLを維持する必要はありません(最初の例で必要になるように)。列名をコマンド文字列に直接構築するのは危険だと思いますこれにより、SQL インジェクションが可能になる可能性があります。

このコードは Web サービスの背後にあることに注意してください。

4

3 に答える 3

23

エンド ユーザーが列名を直接指定できないことを確認してください。クエリを手動で作成する場合は安全です。実行時に有効な列名を確認する必要がある場合は、次のクエリを使用できます。

SELECT column_name
FROM information_schema.columns
WHERE table_schema='public' AND table_name='yourtablename'
于 2011-04-07T17:19:01.297 に答える
1

最も簡単な解決策は、SQLステートメントをその場で作成することだと思います。

ユーザー提供データのパラメーターを使用する場合、SQLインジェクションは不可能です。

于 2011-04-07T17:23:21.080 に答える