1

LIKEWindowsフォームのテキスト入力を介して値が提供される列の比較に基づいて、Sql Server DBに行数を照会しているとします。ここでパラメーターを使用することは、ユーザー入力がインジェクションにつながる可能性があるため重要です。ExecuteScalar()最終的には、名前を付けたインスタンス化されたSqlCommandオブジェクトでメンバー関数を実行しますcmdが、最初にパラメーターを追加する必要があります。例えば:

cmd.Parameters.AddWithValue("@param1", textBox1.Text); 

Sql Server は、比較%のためのワイルドカード マッチとして特殊文字を使用します。LIKE私がやりたかったのは、ユーザーが*代わりにワイルドカードを使用できるようにすることでした。したがって、単純な置換:

textBox1.Text.Replace('*','%');

問題は、特殊記号%_. %ワイルドカードとして使用するのではなく、リテラルを検索する 1 つの方法は、角かっこで囲むことです[%]

だから、今私の置き換えは次のようになる必要があります:

textBox1.Text.Replace("%","[%]").Replace("_","[_]").Replace('*','%');

ここでも順序が重要です。最後のReplaceものを早く作成すると、%正しく処理されないからです。

すべてのベースをカバーしたかどうかわかりませんが、ここで心配する必要がある他のキャラクターはありますか? これは本当に注射から保護しますか?これを行う他の好ましい方法はありますか?

クエリの例は次のようになります。

SELECT COUNT(*) FROM [MyTable] WHERE [Column1] = @param1

はテーブルMyTable名で、Column1は 内の有効な列名ですMyTableColumn1それは何らかのnvarcharタイプであると推測できます。

4

1 に答える 1

1

他には何も必要ありませんが、ユーザー入力から奇妙なことをテストするようにします。あなたが説明していないいくつかの文字は、 で特別な意味を持っていますLIKE:

^
-

パラメーターをステートメントに渡し、やみくもに文字列を追加するのではないため、インジェクションの危険性はほとんどありませんが、次のようなユーザー入力のバリエーションを試してみることをお勧めします。

foo'; DELETE dbo.[UnimportantTable];
foo''; DELETE dbo.[UnimportantTable];
foo''''; DELETE dbo.[UnimportantTable];

繰り返しますが、全体を見ることができないため、脆弱かどうかはわかりませんが、さまざまなテストを作成して、潜在的な結果の幅広いサンプリングですべての潜在的な結果を知ることは非常に簡単だと思います.入力。

@Bryanが指摘したように、リスクを制限する良い方法は、読み取り可能にしたいオブジェクトに対してのみ、非常に明示的な読み取り専用権限を持つログインを使用して接続することです. そうすれば、彼らがあなたの足場の穴を利用したとしても、侵入してもあまりお金にはなりません.

于 2012-08-16T14:59:09.797 に答える