3

ADO.NETでは、コマンドオブジェクトにパラメーターを追加して、SQLクエリにユーザー入力を安全に追加できます。SQLクエリに共通する他の述語に相当するものは何ですか?

私は本質的に非常に限定されたORマッパーとSQLジェネレーターであるプログラムを書いています(それはメタ情報を持つデータベースとそのメタデータに準拠する他のデータベースに重点を置いています)。結果として、私は次のようなものを呼び出すことができる必要があります:

string sql = "select " + USER_SELECTED_COLUMNS + 
            " from " + USER_SELECTED_TABLE + 
            " where " + USER_CRITERIA;

その一部(のようにcriteria)は、信頼できるユーザー(私の会社の他の開発者)によって文字通り私のプログラムに入力されますが、他のデータは、検索などを通じて信頼できないユーザー(クライアント)によって私のプログラムに入力されます。

このプログラムを安全にしたいのですが、上記はそうではないことを認識しています。現在USER_SELECTED_COLUMNS、コマンドパラメータに置き換えていますが、CRITERIAとTABLESに相当するものを見つけることができませんでした。(またはorder-by列)。SqlParameter非選択述語に使用できるのと同様のADO.NET機能はありますか?

4

3 に答える 3

5

1 回の応答で SQL インジェクションを回避する方法を説明できるとは思いませんが、私が提供できる主な指針は次のとおりです。

ブラックリストではなく、ホワイトリストを使用してください。

つまり、 のユーザー入力をサニタイズする場合USER_SELECTED_TABLE、可能な入力は可能なテーブルのみにする必要があります。同様に、 の入力はUSER_SELECTED_COLUMNS、 の可能な列に制限する必要がありますUSER_SELECTED_TABLE

于 2010-11-22T14:05:03.410 に答える
2

ユーザーがテーブルと列を選択できるようにする画面を作成するときは、実際の名前を使用しません。UserID を持っているが、UserName を表示する方法のようなものです。object_id と column_id を使用します (フォーム sys.tables.object_id と sys.columns.object_id+column_id のように)。それらをプロシージャに渡し、システム ビューに結合する数値 ID のみを使用して SQL を構築します。

sys.tables (Transact-SQL)
sys.columns (Transact-SQL)

文字列のテーブル名と列名を連結できますが、それらはユーザー入力ではなくシステム ビューから取得されます。

于 2010-11-22T15:25:46.797 に答える
1

上記で指定したすべての変数をMicrosoft Web Protection Libraryで実行します。SQL インジェクションと XSS 攻撃の両方からの安全性を提供します。コードビハインドでの使用方法を示す例がダウンロードに含まれています。

于 2010-11-22T15:35:38.710 に答える