0

重複の可能性:
.NET の動的 SQL でテーブル/列名をサニタイズしますか? (SQL インジェクション攻撃の防止)

次のようなクエリがあります。

"SELECT * FROM MyTable_" + myID + " WHERE variable = @variable";

SQL パラメーター化は変数で機能しますが、テーブル名で機能させるにはどうすればよいですか? myID は int で渡されて変更されます (文字列に変換できます) が、SQL インジェクションから保護するにはどうすればよいでしょうか?

4

4 に答える 4

5

数値変数である限り、myID有害なコードを含めることはできません。

他に必要なことは、存在しないテーブルを読み取ろうとしたときにエラーメッセージが表示され、他の種類の攻撃に役立つ可能性のあるデータベースレイアウトに関する情報が漏洩しないようにすることだけです。 。

于 2012-12-14T22:44:30.967 に答える
4

なぜあなたがこれをしているのか疑問に思いますがsys.tables、決定的なホワイトリストを探すことができます。

DECLARE @TableName VARCHAR(100) = 'Table to Look for';
DECLARE @Exists BIT = ( SELECT CAST( COUNT(1) AS BIT ) FROM sys.tables WHERE name = @TableName AND type = 'U' );

初期入力をパラメータ化することもできますが、ホワイトリストアプローチは依然として重要です。そうしないと、悪意のあるユーザーがデータベース全体で有効なテーブル名を渡す可能性があり、クエリはそのテーブルに対して実行されます(SELECT権限がある場合)。

于 2012-12-14T22:41:38.780 に答える
1

データベース内のテーブルのリストを取得し、それ"MyTable_" + myIDがそのリストにあることを確認します。

于 2012-12-14T22:40:08.020 に答える
-1

REDESIGNが答えです。動的なテーブル名はありません。元のテーブル名を示すテーブル内の値を持ち、現在のすべてのテーブルに対して 1 つのテーブルだけを持ちます。

システムの他の部分との下位互換性が必要な既存のものに行き詰まっている場合は、アプローチを組み合わせることができます (またそうする必要があります)。エスケープ、ホワイトリストへの登録、または参照はすべて実行可能です。2 つ選んでください。

「参照」と言うときは、すべての有効な名前をリストに入れ、整数インデックスを渡して 1 つを選択します。

于 2012-12-14T22:45:35.343 に答える