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は 内の有効な列名ですMyTable。Column1それは何らかのnvarcharタイプであると推測できます。