データベース テーブルを使用する場合、すべての行に対してクエリを実行するか、それにフィルターを適用するかを選択できます。フィルターは、ユーザー入力によって異なります。オプションがほとんどない場合、それらのいくつかの特定の条件に対して異なるクエリを指定できます。しかし、ユーザーが指定するか指定しないオプションがたくさんある場合、前述の方法は役に立ちません。ユーザー入力に基づいてフィルターを構成し、それを文字列として対応するストアド プロシージャにパラメーターとして送信し、そのフィルターを使用してクエリを作成し、最後に EXECUTE IMMEDIATE(Oracle の場合)。理由はわかりませんが、この方法でクエリを作成するのは本当に好きではありません。このようにして、SQL インジェクターの扉を開いたままにしていると思います。それに、
質問する
127 次
2 に答える
2
リテラルを引用するのではなく、データベース パラメータを使用することが、前進する方法です。
これにより、SQL インジェクションから保護されます。
于 2013-01-09T14:15:31.520 に答える
1
この問題に対処する一般的な方法は、クエリ条件を表す式ツリーを構築し、それらをパラメーター化された SQLに変換して(SQL インジェクションのリスクを回避するため)、パラメーター値を生成された SQL にバインドし、結果のクエリをターゲット データベースに対して実行することです。
正確なアプローチは、クライアント プログラミング フレームワークによって異なります。.NETには、式ツリーをサポートするEntity FrameworkとLINQ2SQLがあります。Java には Hibernate や JPA などがあります。私は、カスタマイズ可能なクエリを構築するために使用されるいくつかの異なるフレームワークを見てきましたが、多くの成功を収めています。これらのフレームワークが利用できない状況では、独自のフレームワークを作成できますが、それにはさらに多くの作業が必要です。
于 2013-01-09T14:19:21.490 に答える