ホームページ >データベース >mysql チュートリアル >SQL インジェクションを防止しながら C# SqlCommand クエリで列名を動的に指定するにはどうすればよいですか?

SQL インジェクションを防止しながら C# SqlCommand クエリで列名を動的に指定するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-18 09:18:11267ブラウズ

How Can I Dynamically Specify Column Names in C# SqlCommand Queries While Preventing SQL Injection?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。