【解決方法】C# コンボ ボックスに表示される SQL データベースのテーブルのリストがあります。コンボ ボックスにリストされたテーブルで特定のレコードを検索するにはどうすればよいですか?

プログラミングQA


コンボ ボックスにリストされている特定の SQL テーブルのレコードを検索する方法

私が試したこと:

C#
Sqlconnection conn = new Sqlconnection ("select * from INFORMATION_SCHEMA.TABLES where firstname like'" + txtIndexSearch. Text + "%'", conn)

解決策 1

テーブルを検索するのと同じ方法。 関連するキーワードを使用して SELECT コマンドを作成します。 また、文字列の連結を使用して SQL コマンドを作成しないでください。適切なパラメーター化されたクエリを使用してください。 bobby-tables.com: SQL インジェクションを防止するためのガイド[^].

解決策 2

コンボ ボックスは危険です。コンボ ボックスを使用すると、ユーザーは必要なものを入力できますが、リスト内の項目だけに制限されるわけではありません。 ドロップダウン リストの方が安全ですが、注意が必要です。 理由は簡単です。 ユーザーが SQL コマンドの一部になるものに直接影響を与えることができる場合、データベースは SQL インジェクションの危険にさらされ、データベースが損傷または破壊される可能性があります。
残念ながら、SQL DB エンジンがコマンドを処理する順序が原因で、テーブル名をパラメーターとして渡すことはできません。

検索テキストにもまったく同じ問題があります。文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

どの SQL が 3 つの別個のコマンドとして認識されるか:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全に有効な SELECT

SQL
DROP TABLE MyTable;

完全に有効な「テーブルの削除」コマンド

SQL
--'

そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。

したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?

そのため、やりたいことを実行することは可能ですが、「安全な」コマンド (使用が許可されている有効な SQLK テーブル名のコレクション) のみを入力できるようにしない限り、お勧めできません。

その後は簡単です: コレクションからテーブル名を追加し、検索テキストをパラメーターとして追加します。

C#
string sql = $"SELECT * FROM {validTables[index]} WHERE firstName LIKE '%' + @FN + '%'";
using (SqlCommand cmd = new SqlCommand(sql, con))
   {
   cmd.Parameters.AddWithValue("@FN", txtIndexSearch.Text);
   ...
   }

コメント

タイトルとURLをコピーしました