[ad_1]
コンボ ボックスにリストされている特定の SQL テーブルのレコードを検索する方法
私が試したこと:
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 が次のようなコマンドを受け取るため、問題が発生します。
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
どの SQL が 3 つの別個のコマンドとして認識されるか:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
完全に有効な SELECT
DROP TABLE MyTable;
完全に有効な「テーブルの削除」コマンド
--'
そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。
したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?
そのため、やりたいことを実行することは可能ですが、「安全な」コマンド (使用が許可されている有効な SQLK テーブル名のコレクション) のみを入力できるようにしない限り、お勧めできません。
その後は簡単です: コレクションからテーブル名を追加し、検索テキストをパラメーターとして追加します。
string sql = $"SELECT * FROM {validTables[index]} WHERE firstName LIKE '%' + @FN + '%'"; using (SqlCommand cmd = new SqlCommand(sql, con)) { cmd.Parameters.AddWithValue("@FN", txtIndexSearch.Text); ... }
[ad_2]
コメント