4

検索で、以下のように形成された SQL クエリでパラメーター化された文字列を使用しているのを見てきました。

SqlCommand comm = new SqlCommand();
comm.CommandText="SELECT * FROM table WHERE field LIKE '%'+@var+'%'";
comm.Parameters.AddWithValue("var","variabletext");
SqlDataReader reader = comm.ExecuteReader();

ただし、このフォーラムでは、パラメータ化された文字列で使用されているにもかかわらず、SQL インジェクションの対象であることが言及されました。連結された文字列はすべてのパラメーター化されたセキュリティをバイパスし、値を文字列として直接挿入するだけであると想定できます。この場合、SQL コード インジェクションを回避しながら、パラメーター化されたクエリでワイルドカード演算子を使用するにはどうすればよいでしょうか。

4

2 に答える 2

3

これは、SQL インジェクションに対して脆弱ではありません。

誰があなたにそれを言ったとしても、それは間違っています。'%'+@var+'%'実行可能コードとしてではなく、データとして扱われます。これは文字列として評価され、右側のパターンとして使用されますLIKE

EXECそのような連結の結果になった場合にのみ、問題が発生します。クエリ自体で単純に文字列連結を実行することは問題ではありません。

于 2012-10-30T18:59:59.687 に答える
2

"SqlParameter"検索を行うストアド プロシージャに値を送信するために使用する必要があります。の目的は"SqlParameter"、値内のすべてのインジェクションを拒否することです。また、SQL コードを含むテキストを実行するか、パラメータを連結する必要がある場合"CommandType"は、コマンドのプロパティを に設定し、 "Text"a を使用し"SqlParameter"てそのテキストに値を送信する必要があります。

これについては、次の Microsoft ドキュメントを参照してください。

http://msdn.microsoft.com/en-us/library/ff648339.aspx

また、ここでstackoverflowに関する別の質問:

SQLParameter はどのように SQL インジェクションを防ぎますか?

また、いくつかの具体的な例については、こちらをご覧ください。

.NET で SQLParameter を使用している場合でも SQL インジェクションの例はありますか?

アップデート:

質問を更新したので、実行方法が正確に指定されたので、言及したコードにSQLインジェクションの問題はもうありません。

乾杯

于 2012-10-30T18:58:02.593 に答える