ホームページ >データベース >mysql チュートリアル >SQL インジェクションを防止しながら C# SqlCommand クエリで列名を動的に指定するにはどうすればよいですか?
C# SqlCommand での列名の動的なクエリ調整
SqlCommand オブジェクトのパラメーターを使用して列名を指定しようとすると、パラメーターを列名に使用できないことを示すエラー。この制限により、列名が異なるクエリを実行しようとするときに問題が発生します。
問題:
SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE name=@name; "); prikaz.Parameters.AddWithValue("name", name); prikaz.Parameters.AddWithValue("slot", slot);
上記のコードは、動的列を使用してクエリを実行しようとしています。パラメータを使用して名前を付けますが、前述のエラーが発生して失敗します。提案される可能性のある回避策は、列名の変数宣言を含むストアド プロシージャ (SP) を使用することです。ただし、このアプローチは面倒な場合があります。
解決策:
列名をパラメータ化する代わりに、実行時にクエリを動的に構築できます。セキュリティを確保するには、入力をホワイトリストに登録して、インジェクション攻撃を防ぐ必要があります。これを実現する方法の例を次に示します。
// TODO: verify that "slot" is an approved/expected value SqlCommand command = new SqlCommand("SELECT [" + slot + "] FROM Users WHERE name=@name; ") prikaz.Parameters.AddWithValue("name", name);
このコードでは、実行時にクエリ文字列を構築するために「slot」の値が使用されます。 SQL インジェクションを防ぐために、パラメーター "name" は引き続きパラメーターを使用して指定されます。クエリを動的に構築することで、SqlCommand で列名にパラメーターを使用するという制限を克服できます。
以上がSQL インジェクションを防止しながら C# SqlCommand クエリで列名を動的に指定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。