3

SqlCommand.Parameters.AddWithValue()クエリの変更点

私はそれを期待しています:

  1. 'すべての文字を'',に置き換えます

  2. パラメータ値が文字列または文字列に変換する必要があるものである場合、値を で囲みます。'たとえば、select * from A where B = @helloは になりますselect * from A where B = 'hello world'

  3. パラメータ値が整数のような「安全な」ものである場合、引用符なしでそのままクエリに挿入されるためselect * from A where B = @oneselect * from A where B = 1.

私が気付いていない他の変更はありますか?

4

2 に答える 2

7

ADO.NET SqlClient ドライバーは置換を行いません! これはよくある誤解です。何かを置き換える手間が省けます。

@param1 ... @paramNこれが行うことは、パラメーター名と値のペアのコレクションと共に、パラメーターを含むクエリを SQL Server に直接渡すことです。その後、SQL Server は、sp_executesqlストアド プロシージャを使用してそれらを実行します。

クライアント側で「完全な SQL ステートメントをつなぎ合わせる」ことはありません。そのようなことはありません。これが ADO​​.NET ランタイムで実行されていた場合、SQL インジェクション攻撃の影響を非常に受けやすくなります。

于 2010-07-14T03:24:58.437 に答える
0

簡単な答えは、それを使用すると、SqlParameterCollection の末尾に値が追加され、パラメーター値が SQL インジェクションから保護されるということです。

MSDN のドキュメントには、メソッドの正確な内部動作が記載されていません。ただし、必要に応じて、Reflectorを使用してメソッドのソース コードを表示し、その動作を正確に確認できます。

于 2010-07-14T03:25:33.217 に答える